2013-04-27 12 views
17

でネストされたコレクションで、モデル内の特定の属性の変化を聴く:私は、以下の骨格構造持つバックボーン

- collection[order_items] 
    - collection[menu_items] 
     - price 
     - quantity 

を、私は量属性の変更をリッスンしたい、私はそれがで作業しました

var CheckoutView = Backbone.Marionette.ItemView.extend({ 

    template: '#template-checkout', 

    initialize: function (options) { 
     this.order_collection = options.collection; 
     _(this.order_collection.models).each(function (element, index, list) { 
      this.listenTo(element.get("menu_items"), "change:quantity", this.onOrderItemsChanged); 
     }, this); 

    }, 

    onOrderItemsChanged: function (model, val, options) { 
     console.log(model.get("name")); 
    } 

}); 

しかし、マリオネットまたはバックボーンがそれを行うためのより良い方法を持っていない、代わりに親コレクションthroughtルーピングとそれぞれの子コレクションにリスナーを追加する、多分

のようなもの

this.listenTo(this.order_collection, "change:menu_items:quantity", this.on OrderItemsChanged)

(私のために仕事をdidntの)

答えて

6

Backbone.DeepModelを見てみましょう。明らかに、深い構造の単一のモデルとしてOrderを表現し、change:order_items.*.menu_items.*またはchange:order_items.menu_items.*のいずれかを聞くことができます。このソリューションでは、ネストされたリストの利点をBackbone.Collectionとして使用できないことに注意してください。私はそれが良いトレードオフだと思うが、あなたの走行距離は変わるかもしれない

-8

バックボーンコレクションはバックボーンモデルと同じように独自のイベントを持っています。コレクションのイベントをバインドするだけで、その中のすべてのモデルがリスンします。例:

this.order_collection.models.on('change:quantity', function(model, updatedQuantity) { 
    alert("Changed quantity from " + model.previous("quantity") + " to " + updatedQuantity);); 
}); 

したがって、コレクション内のモデルでトリガーされたイベントもコレクションでトリガーされます。

+8

申し訳ありませんが、私はどのようにこの作品が表示されません。 'Collection.models'は生の配列であり、配列には' on'メソッドがありません。何か不足していますか? – ericsoco

+0

@ericosocoは正しいですが、これはうまくいかず、どのように動作するのかわかりません。 – dvdplm

+2

合意 - これは、.models.onではなく "this.order_collection.on"に更新する必要があると思います。 –

関連する問題