2013-03-20 7 views
7

मैं एक कठपुतली CollectionView में गतिशील itemViews हेरफेर करने के लिए कोशिश कर रहा हूँ। संग्रह में एक ही मॉडल हैं, लेकिन मैंने मॉडल के अंदर टेम्पलेटनाम तर्क परिभाषित किया है।क्या RequJS के साथ गतिशील रूप से Marionette ItemView टेम्पलेट को बदलने का कोई तरीका है?

सवाल है, मैं इस तर्क से हेरफेर कर सकते हैं ItemView टेम्पलेट?

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

धन्यवाद!

+2

मैं 'getTemplate' फ़ंक्शन के साथ आइटम व्यू में टेम्पलेट का नाम असाइन करूंगा। https://github.com/marionettejs/backbone.marionette/blob/master/docs/marionette.view.md#change-which-template-is-rendered-for-a-view –

+0

और वहाँ एक तरीका है, प्रस्तुत करने के लिए requirejs टेम्पलेट लोड करने के बाद itemview? टेम्पलेट की आवश्यकता होने से पहले, आपके सोल्शन के साथ कोस मुझे नोटमैप त्रुटि मिलती है। 'getTemplate: function() {की आवश्यकता होती है ([ 'पाठ टेम्पलेट्स /!' + This.model.get ('editor_template') + '.html'], समारोह (खाका) {वापसी _.template (खाका);});} ' –

उत्तर

24

आप getTemplate समारोह को ओवरराइड और वहाँ अपने कस्टम तर्क लिख सकते हैं। Marionette documentation recommends निम्न विकल्प:

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

मुझे लगता है कि gumballhead सही रास्ते पर है। ऐसा करने के लिए आप getTemplate फ़ंक्शन को ओवरराइड कर सकते हैं।


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


}); 

आशा है कि तुम क्या

2

सबसे पहले जरूरत है मैं हर किसी के लिए धन्यवाद, जिन्होंने मेरी मदद करने की कोशिश की करना चाहते हैं करता है। मैंने अपनी समस्या का समाधान किया। यदि किसी की जरूरत यहाँ, 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; 
}); 

संपादित: (बेहतर sollution)

सुझावों का स्वागत है!

संबंधित मुद्दे