2013-08-02 10 views
8

Bir CompositeView uygulamasının veriyi tanımlanmış öğeye aktarıp kapatamadığını merak ediyorum. Örnek (azaltılmış) kod:Backbone.Marionette: Verileri bir CompositeView aracılığıyla aşağıya öğesindenViewView?

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

İki tane html tablosu oluşturmak için kullanıyorum. # table-row-template, farklı "sütun" türlerini desteklemek için bazı işleme mantığına sahiptir. Bu, farklı Koleksiyonlar/Model türleri için aynı görünümleri kullanmamı sağlar (API'yi izledikleri sürece). Şimdiye kadar, gayet iyi çalışıyor!

Ancak, yukarıdaki gibi görebildiğiniz gibi, her "satır" her seferinde aynı "sütunlar" verilerini almak için bir çağrı yapar, sadece bunu bir kez aşağı aktarmak istediğimde ve herkes için kullanılır.

Öneriler?

Teşekkürler!

cevap

13

Sen ile ya bir nesne ya da bir fonksiyon olarak

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

VEYA

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

ve ardından alma seçenekleri itemViewOptions kullanabilirsiniz: Not *

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

(yani itemView, itemV iewContainer ve itemViewOptionschildView, childViewContainer ve childViewOptions) sürüm 2 değiştirilir.

+1

Takdir. Çok teşekkürler. Dokümanlar bir güncelleme yapabilirdi. – starmonkey

+4

n.b. Marionette v2, 'item *' '' child * 'olarak değiştirildi – alxndr

İlgili konular