2013-03-20 10 views
7

Ben itemViews bir Marionette CollectionView dinamik olarak işlemeye çalışıyorum. Koleksiyonlar aynı modellere sahip, ancak modellerin içinde templateName argümanını tanımladım.Marionette ItemView şablonunu RequireJS ile dinamik olarak değiştirmenin bir yolu var mı?

Soru şu, bu argüman tarafından ItemView şablonunu kullanabilir miyim?

ItemView:

define(['text!templates/ComponentItemViewTemplate.html','models/ComponentModel'], function (template, model) { 
    var ItemView = Backbone.Marionette.ItemView.extend({ 
     template: _.template(template), 
     model: model 
    }); 

    return ItemView; 
}); 

CollectionView:

define(['views/ComponentItemView', 'views/LoadingView'], function(ItemView, LoadingView) { 
    var ComponentListView = Backbone.Marionette.CollectionView.extend({ 
     emptyView : LoadingView, 
     id: "component-list", 
     itemView: ItemView, 
     events: { 
      'click .title span' : 'show' 
     }, 
     appendHtml: function(collectionView, itemView, index){//i would like to render different templates, for different models. 
      itemView.$el.draggable({ helper: "clone", cancel: ".component .title span", connectToSortable: ".ui-sortable" }); 
      collectionView.$el.append(itemView.el); 
     }, 
     show: function(r) { 
      var target = $(r.target); 
      if(target.parent().hasClass('open')){ 
       target.parent().removeClass('open'); 
       target.parent().next().slideDown('fast'); 
      }else{ 
       target.parent().addClass('open'); 
       target.parent().next().slideUp('fast'); 
      } 
     } 
    }); 

    return ComponentListView; 
}); 

teşekkürler!

+2

ben 'getTemplate' işlevi ile, ItemView Şablon adını vereceği bildirildi. https://github.com/marionettejs/backbone.marionette/blob/master/docs/marionette.view.md#change-which-template-is-rendered-for-a-view –

+0

Ve işlemek için bir yol var mı requirejs şablon yüklendikten sonra itemview? Solventinizle Cose, şablona ihtiyaç duymadan önce hata yapmam. 'getTemplate: function() {require (['text! Templates /' + this.model.get ('editor_template') + '.html'], işlev (Şablon) {return _.template (Şablon);});} ' –

cevap

24

getTemplate işlevini geçersiz kılabilir ve burada özel mantığınızı yazabilirsiniz. Marionette documentation recommends aşağıdaki seçeneği:

MyView = Backbone.Marionette.ItemView.extend({ 
    getTemplate: function(){ 
    if (this.model.get("foo")){ 
     return "#some-template"; 
    } else { 
     return "#a-different-template"; 
    } 
    } 
}); 
6

Bence gumballhead doğru yolda. Bunu yapmak için getTemplate işlevini geçersiz kılabilirsiniz. i bana yardım etmeye çalıştı herkes için teşekkür etmek istiyorum her şeyden

2

İlk gerekenleri yapar


MyCollectionView = Marionette.CollectionView.extend({ 

    // ... 

    getItemView: function(item){ 
    // get the template from the item... or wherever else it comes from 
    return new MyViewType({ 
     template: item.get("the-template") 
    }); 
    } 


}); 

Umut. Kendi sorunumu çözdüm. Birisi o gerekiyorsa Burada , sollution:

define(['models/ComponentModel'], function (model) { 

    var ItemView = Backbone.Marionette.ItemView.extend({ 
     model: model, 
     render: function() { 
      var that = this; 
      var data = this.serializeData(); 

      require(['text!templates/components/editor/' + that.model.get('editor_template') + '.html'], function(Template){ 
       var html = _.template(Template, data); 
       that.$el.html(html); 
      }); 
     } 
    }); 

    return ItemView; 
}); 

düzenlendi: (Daha iyi sollution)

Önerilerinizi bekliyoruz!