2013-04-27 13 views
17

Ho la seguente struttura portante:ascoltare una specifica modifica degli attributi in un modello in una raccolta nidificato in Backbone

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

e voglio ascoltare di eventuali modifiche di attributo quantità, ho ottenuto che funziona da

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

}); 

ma lo fa marionetta o spina dorsale hanno un modo migliore di farlo, invece di looping throught la raccolta genitore e aggiungendo l'ascoltatore ad ogni collezione bambino, forse qualcosa di simile

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

(che ha funzionato per me)

risposta

6

Date un'occhiata a Backbone.DeepModel. Apparentemente, puoi rappresentare Ordine come un singolo modello con struttura profonda e ascoltare change:order_items.*.menu_items.* o change:order_items.menu_items.*. Nota che questa soluzione ti impedisce di utilizzare i vantaggi degli elenchi annidati come Backbone.Collection. Penso che sia un buon compromesso, ma il tuo chilometraggio può variare

-8

La collezione di backbone ha i suoi eventi come i modelli Backbone. Devi solo legare l'evento nella tua collezione e tutti i modelli al suo interno lo ascolteranno. Ad esempio:

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

Quindi, gli eventi attivati ​​su un modello in una raccolta verranno attivati ​​anche nella raccolta.

+8

Siamo spiacenti, non vedo come funziona. 'Collection.models' è una matrice raw e la matrice non ha un metodo' on'. Mi sto perdendo qualcosa? – ericsoco

+0

@ericosoco ha ragione, questo non funziona e non vedo come potrebbe funzionare. – dvdplm

+2

D'accordo - Penso che questo dovrebbe essere aggiornato per essere "this.order_collection.on" piuttosto che .models.on. –

Problemi correlati