Прослушивание определенных изменений атрибутов в модели во вложенной коллекции в 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)

(что не сработало для меня)


person Yehia A.Salam    schedule 27.04.2013    source источник


Ответы (2)


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

person Alexander Lebedev    schedule 28.04.2013

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

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

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

person ricardohdz    schedule 28.04.2013
comment
Извините, я не понимаю, как это работает. Collection.models — это необработанный массив, а в массиве нет метода on. Я что-то пропустил? - person ericsoco; 18.07.2013
comment
@ericosoco прав, это не работает, и я не понимаю, как это может работать. - person dvdplm; 09.08.2013
comment
Согласен - я думаю, что это должно быть обновлено, чтобы быть this.order_collection.on, а не .models.on. - person Bryan Rayner; 30.10.2013