backbone.js - source - Escuche los cambios de un atributo específico en un modelo en una colección anidada en Backbone
underscore js download (2)
Tengo la siguiente estructura de red troncal:
- collection[order_items]
- collection[menu_items]
- price
- quantity
y quiero escuchar cualquier cambio en el atributo de cantidad, lo tengo funcionando por
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"));
}
});
Pero, ¿la marioneta o la red troncal tienen una mejor manera de hacerlo, en lugar de recorrer la colección principal y agregar al oyente a cada colección secundaria?
this.listenTo(this.order_collection, "change:menu_items:quantity", this.on OrderItemsChanged)
(que no funcionó para mí)
Echa un vistazo a Backbone.DeepModel . Aparentemente, puede representar a Order como un modelo único con una estructura profunda y escuchar cualquiera de los change:order_items.*.menu_items.*
O change:order_items.menu_items.*
. Tenga en cuenta que esta solución le impide utilizar los beneficios de las listas anidadas como Backbone.Collection. Creo que es una buena compensación, pero su kilometraje puede variar
La colección Backbone tiene sus propios eventos como lo hacen los modelos Backbone. Solo tienes que enlazar el evento en tu colección y todos los modelos dentro lo escucharán. P.ej:
this.order_collection.models.on(''change:quantity'', function(model, updatedQuantity) {
alert("Changed quantity from " + model.previous("quantity") + " to " + updatedQuantity););
});
Por lo tanto, los eventos activados en un modelo en una colección también se activarán en la colección.