有没有办法用RequireJS动态更改Marionette ItemView模板?

Rob*_*ori 7 requirejs backbone.js marionette

我正试图在Marionette CollectionView中动态操作itemViews.集合具有相同的模型,但我在模型中定义了templateName参数.

问题是,我可以通过这个参数操纵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;
});
Run Code Online (Sandbox Code Playgroud)

的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;
});
Run Code Online (Sandbox Code Playgroud)

谢谢!

kir*_*uga 25

您可以覆盖getTemplate函数并在那里编写自定义逻辑.该木偶文档建议以下选项:

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


Der*_*ley 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")
    });
  }


});
Run Code Online (Sandbox Code Playgroud)

希望能满足您的需求