在Backbone的嵌套集合中监听模型中的特定属性更改

时间:2013-04-27 10:07:43

标签: backbone.js marionette

我有以下主干结构:

- 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)

(这对我没用)

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:-8)

Backbone集合有自己的事件,如Backbone模型。您只需要绑定集合中的事件,其中的所有模型都将监听它。例如:

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

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