18

我有以下主干结构:

- 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"));
    }

});

但是木偶或骨干是否有更好的方法来做到这一点,而不是循环遍历父集合并将侦听器添加到每个子集合,也许像

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

(这对我不起作用)

4

2 回答 2

6

看看Backbone.DeepModel。显然,您可以将 Order 表示为具有深层结构的单个模型,并收听change:order_items.*.menu_items.*change:order_items.menu_items.*。请注意,此解决方案会阻止您将嵌套列表的好处用作 Backbone.Collection。我认为这是一个很好的权衡,但你的里程可能会有所不同

于 2013-04-28T07:10:25.177 回答
-8

与 Backbone 模型一样,Backbone 集合具有自己的事件。您只需在集合中绑定事件,其中的所有模型都会监听它。例如:

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

因此,在集合中的模型上触发的事件也将在集合上触发。

于 2013-04-28T13:56:01.140 回答