Hören Sie sich eine bestimmte Attributänderung in einem Modell in einer verschachtelten Sammlung in Backbone an
Habe ich den folgenden backbone-Struktur:
- collection[order_items]
- collection[menu_items]
- price
- quantity
und ich will hören für alle änderungen in der Menge-Attribut, ich habe es funktioniert durch
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"));
}
});
Aber nicht marionette oder Rückgrat haben, einen besseren Weg, es zu tun, anstatt einer Schleife durch die übergeordnete Sammlung und das hinzufügen der listener auf jedes Kind Sammlung, vielleicht so etwas wie
this.listenTo(this.order_collection, "change:menu_items:quantity", this.on OrderItemsChanged)
(die nicht für mich arbeiten)
InformationsquelleAutor der Frage Yehia A.Salam | 2013-04-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werfen Sie einen Blick auf Rückgrat.DeepModel. Offenbar Sie darstellen kann, Um als ein einzelnes Modell mit tiefer Struktur und hören Sie entweder
change:order_items.*.menu_items.*
oderchange:order_items.menu_items.*
. Beachten Sie, dass diese Lösung verhindert, dass Sie die Vorteile von verschachtelten Listen als Rückgrat.Sammlung. Ich denke, es ist ein guter Kompromiss, aber Ihre Laufleistung variierenInformationsquelleAutor der Antwort Alexander Lebedev
Backbone Kollektion hat Ihre eigenen Veranstaltungen als Rückgrat Modelle tun. Sie müssen nur binden Sie die Veranstaltung in Ihrer Sammlung haben und alle Modelle von innen wird es hören. Eg:
Also Ereignisse ausgelöst werden, auf ein Modell in einer Sammlung werden auch ausgelöst werden, auf die Sammlung.
InformationsquelleAutor der Antwort ricardohdz