Прослушайте определенные изменения атрибутов в модели во вложенной коллекции в 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)
(который не работал у меня)
Ответы
Ответ 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););
});
Таким образом, события, вызванные моделью в коллекции, также будут запущены в коллекции.