Подтвердить что ты не робот

Прослушайте определенные изменения атрибутов в модели во вложенной коллекции в Backbone

У меня есть следующая структурная схема:

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

(который не работал у меня)

4b9b3361

Ответ 1

Посмотрите Backbone.DeepModel. По-видимому, вы можете представлять Order как единую модель с глубокой структурой и слушать либо change:order_items.*.menu_items.*, либо change:order_items.menu_items.*. Обратите внимание, что это решение не позволяет использовать преимущества вложенных списков как Backbone.Collection. Я думаю, что это хороший компромисс, но ваш пробег может меняться

Ответ 2

У базовой сети есть свои собственные события, как модели Backbone. Вам просто нужно связать событие в своей коллекции, и все модели внутри него послушат его. Например:

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

Таким образом, события, вызванные моделью в коллекции, также будут запущены в коллекции.