Слушайте промените на специфичен атрибут в модел във вложена колекция в 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