2013-04-27 12 views
17

Mam następującą strukturę szkieletową:słuchać określonych zmian atrybutów w modelu w zagnieżdżonych kolekcji w sieci szkieletowej

- collection[order_items] 
    - collection[menu_items] 
     - price 
     - quantity 

i chcę słuchać o wszelkich zmianach w atrybucie ilości, mam to działa przez

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")); 
    } 

}); 

Ale czy marionetka lub kręgosłup mają lepszy sposób to zrobić, zamiast pętli throught kolekcji nadrzędnej i dodanie słuchacza do każdej kolekcji dziecięcej, może coś podobnego

this.listenTo(this.order_collection, "change:menu_items:quantity", this.on OrderItemsChanged)

(który zrobił praca dla mnie)

Odpowiedz

6

Spójrz na Backbone.DeepModel. Wygląda na to, że możesz reprezentować Order jako pojedynczy model o głębokiej strukturze i słuchać change:order_items.*.menu_items.* lub change:order_items.menu_items.*. Należy zauważyć, że to rozwiązanie uniemożliwia korzystanie z zalet zagnieżdżonych list jako Backbone.Collection. Myślę, że to dobry kompromis, ale twój przebieg może się różnić

-8

Kolekcja kręgosłupa ma własne zdarzenia, jak robią modele szkieletu. Musisz tylko związać wydarzenie w swojej kolekcji i wszystkie modele w nim będą go słuchać. Np .:

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

W związku z tym zdarzenia wywołane w modelu w kolekcji będą również wywoływane w kolekcji.

+8

Niestety, nie rozumiem, jak to działa. 'Collection.models' to surowy Array, a Array nie ma metody" on ". Czy czegoś brakuje? – ericsoco

+0

@ericosoco ma rację, to nie działa i nie widzę jak to może działać. – dvdplm

+2

Uzgodnione - myślę, że powinno to zostać zaktualizowane, aby było "this.order_collection.on" zamiast .models.on. –