2013-08-02 9 views
8

Zastanawiam się, czy/jak CompositeView może przekazywać dane do zdefiniowanego itemView. Przykład (zredukowany) kod:Backbone.Marionette: przekazywać dane przez CompositeView do jego itemView?

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

Używam tych dwóch do renderowania tabeli html. # table-row-template ma pewną logikę renderowania dla obsługi różnych typów "kolumn". To pozwala mi używać tych samych widoków dla różnych typów kolekcji/modeli (pod warunkiem, że podążają one za API). Jak dotąd działa całkiem dobrze!

Jednak, jak widać powyżej, każdy "wiersz" wywołuje za każdym razem te same dane "kolumnowe", kiedy naprawdę chciałem tylko raz przekazać to i wykorzystać dla wszystkich.

Zalecenia?

Dzięki!

Odpowiedz

13

Można użyć itemViewOptions albo jako przedmiot lub funkcji

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

LUB

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

a następnie otrzymują opcje z:

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

(* Należy pamiętać, że itemView, itemV iewContainer i itemViewOptions zmieniane są w wersji 2 do childView, childViewContainer i childViewOptions).

+1

Doceniony. Wielkie dzięki. Dokumenty mogą zrobić z aktualizacją. – starmonkey

+4

n.b. że Marionetka v2 zmieniła "element *" na "dziecko *" – alxndr