Marionette CollectionView带有一个独特的ItemView

时间:2013-03-30 21:43:44

标签: backbone.js marionette collectionview

有没有办法在Marionette CollectionView中创建一个独特的视图?我的意思是这样的:

的CollectionView

  • StartView(这是唯一的视图)
  • 常规项目视图
  • 常规项目视图
  • 常规项目视图

通过唯一,我的意思是“Start ItemView”必须使用唯一的模板,而不是与常规ItemViews相关联的方法。

我尝试过的事情:

  • 将开始视图添加到CollectionView的el之前是不可取的,因为我的CollectionView的方法会对其子视图起作用。

  • 在Marionette文档中,建议在这种情况下覆盖buildItemView(我认为?)。我不知道如何覆盖它。只是调用buildItemView不起作用,因为StartView没有关联的模型或任何选项。好像我不能把这些args留下来,或者它只是返回undefined。

  • 我无法在CollectionView的模板中包含StartView的标记,因为... Marionette CollectionViews无法使用模板。

  • 从Marionette文档中,它似乎不适合CompositeView的用例。但也许我错了。

我可能错过了一些相当明显的东西。在此先感谢您的帮助。

编辑:格式化

2 个答案:

答案 0 :(得分:5)

创建2个不同的视图,'StartView'和'NormalView':

StartView = Marionette.ItemView.extend({
    template:"#start-template'
});
NormalView = Marionette.ItemView.extend({
    template:"#normal-template"
});

在你的集合视图中,覆盖getItemView并返回你的'StartView'和'NormalView'......就像这样:

MyCollectionView = Marionette.CollectionView.extend({
   getItemView:function(item){
       if(item.get("ImTheFirst")===true)
          return StartView;
        else
          return NormalView;
    }
});

在集合中的第一项上,添加属性“ImTheFirst”(例如)并将其设置为true。

答案 1 :(得分:2)

您在这里寻找的是CompositeViewCompositeViewItemViewCollectionView之间的混搭。基本上,CompositeView本身将作为您的StartView,然后您定义一个ItemView作为您的“常规项目视图”。 像这样:

RegularItemView = Backbone.Marionette.ItemView.extend({
  template: "#regular-itemview-template"
});

CompositeView = Backbone.Marionette.CompositeView.extend({
  itemView: RegularItemView,
  template: "#start-template"
});