我可以在运行时指定compositview的itemview模板吗?

时间:2013-06-24 15:31:28

标签: marionette

我正在尝试指定在运行时为compositView项目视图呈现的模板。

如果有的话可以发布一个例子 itemViewOptions无法正常工作

10倍

2 个答案:

答案 0 :(得分:3)

我认为你需要的函数是getTemplate,在这里你定义了在运行时决定使用哪个模板所需的行为,在你的ItemView中定义它。

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

以下是文档的链接。     https://github.com/marionettejs/backbone.marionette/blob/master/docs/marionette.view.md#viewtemplatehelpers

修改

我创建了一个JS小提琴,这只是一个如何从复合视图中将选项传递给itemView的示例。 http://jsfiddle.net/rayweb_on/bCkUe/

var SampleCompositeView = Backbone.Marionette.CompositeView.extend({
    template : "#compositeViewTemplate",
    templatetoUseinItemView : '#sample-template2',
    itemView : SampleView,
    buildItemView: function(item, ItemViewType, itemViewOptions){
         var options = _.extend({model: item}, itemViewOptions);
         options.templatetoUseinItemView = this.templatetoUseinItemView;
         var view = new ItemViewType(options);
         return view;
    },   
});

如果您需要根据选项值对模板进行额外设置,您仍然可以使用ItemView的getTemplate函数。 因为我根本不知道你的代码是我能提供的最好的例子。

希望这有帮助。

答案 1 :(得分:1)

我做的另一种方法是将模板选择器作为itemViewOptions中的项之一传递。

MyCompositeViewInstance = new MyCompositeView(
                         {collection: col,
                          itemViewOptions: { template:"#myTemplate"});

在itemView的initialize()中,模板的默认值可以这样改变:

if(options.template) {
this.template = options.template;
}

现在,视图通过覆盖在ItemView中指定为默认值的初始值来渲染使用新模板。