2013-08-02 9 views
8

Mi chiedo se/come un oggetto CompositeView può trasferire i dati nel suo itemView definito. Esempio (ridotto) Codice:Backbone.Marionette: passa i dati attraverso un oggetto CompositeView al relativo elementoView?

var TableView = Backbone.Marionette.CompositeView.extend({ 
    template: '#table-template', 
    itemView: TableRowView, 
    itemViewContainer: 'tbody', 
}); 

var TableRowView = Backbone.Marionette.ItemView.extend({ 
    tagName: 'tr', 
    template: '#table-row-template', 
    serializeData: function() { 
     var data = { 
      model: this.model, 
      // FIXME This should really only be called once. Pass into TableView, and down into TableRowView? 
      // That way, getDisplayColumns can be moved to the collection as well, where it makes more sense for it to belong. 
      columns: this.model.getDisplayColumns() 
     }; 
     return data; 
    } 
}); 

sto usando i due per il rendering di una tabella HTML. # table-row-template ha qualche logica di rendering per supportare diversi tipi di "colonne". Ciò mi consente di utilizzare le stesse visualizzazioni per diversi tipi di collezioni/modelli (purché seguano l'API). Finora funziona abbastanza bene!

Tuttavia, come potete vedere sopra, ogni "riga" effettua una chiamata per ottenere gli stessi dati "colonne" ogni volta, quando in realtà volevo solo passare quella in basso una volta, e usare per tutti.

Raccomandazioni?

Grazie!

risposta

13

È possibile utilizzare itemViewOptions sia come un oggetto o di una funzione

var TableView = Backbone.Marionette.CompositeView.extend({ 
    template: '#table-template', 
    itemView: TableRowView, 
    itemViewContainer: 'tbody', 
    itemViewOptions: { 
     columns: SOMEOBJECTORVALUE 
    } 
}); 

O

var TableView = Backbone.Marionette.CompositeView.extend({ 
    template: '#table-template', 
    itemView: TableRowView, 
    itemViewContainer: 'tbody', 
    itemViewOptions: function(model,index){ 
     return{ 
      columns: SOMEOBJECTORVALUE 
     } 
    } 
}); 

e quindi ricevere le opzioni con:

var TableRowView = Backbone.Marionette.ItemView.extend({ 
    tagName: 'tr', 
    template: '#table-row-template', 
    initialize: function(options){ 
     this.columns = options.columns; 
    } 
}); 

(* Si noti che itemView, itemV iewContainer e itemViewOptions vengono modificati in versione 2 alla childView, childViewContainer e childViewOptions).

+1

Apprezzato. Grazie molto. Doc potrebbe fare con un aggiornamento. – starmonkey

+4

n.b. che Marionette v2 ha cambiato 'item *' in 'child *' – alxndr

Problemi correlati