2013-03-20 42 views
6

我有一个的CollectionView在Marionette CollectionView中,如何将模型的索引(集合中)传递给ItemView?

class MyCollectionView extends Backbone.Marionette.CollectionView 
    itemView: MyItemView 

    itemViewOptions: -> 
    { 
     indexInCollection: ? 
    } 

而且我想MyItemView知道在该指数集合在它的模型在。

我想,在MyItemView,我可以通过

@model.collection.indexOf(@model) 

发现它不过是有办法在通过它直接进入从我的木偶的CollectionView MyItemView,利用一些内部机制的木偶?这个索引是否已经暴露在某个地方?

回答

12

itemViewOptions当设置为功能时,接收itemmodel参数。使用此找到索引:


class MyCollectionView extends Backbone.Marionette.CollectionView 
    itemView: MyItemView 

    itemViewOptions: (model) -> 
    { 
     indexInCollection: this.collection.indexOf(model) 
    } 
+0

完美啊 - 我知道一定有喜欢的事,优雅这个。谢谢Derick。 – Joerg 2013-03-21 06:23:54

+0

我很酷,我还没有意识到这一点! – 2013-03-21 13:29:43

+0

伟大的解决方案 – jmeas 2013-11-22 21:28:05

1

只是增加了前面的答案,如果你想使用的选项之一的视图模板之一,你可以简单地做这样的:

class Run.Question extends Backbone.Marionette.ItemView 
    template: "mock/run/question" 
    initialize: -> 
     @model = @model.set index: @options.index 

class Run.Content extends Backbone.Marionette.CompositeView 
    template: "mock/run/content" 
    itemView: Run.Question 
    itemViewContainer: "div.data-box" 
    itemViewOptions: (model) -> 
     { 
      index: @collection.indexOf(model) + 1 
     } 

这样,您可以访问模板中的“索引”变量。

+1

可能更适合覆盖'serializeData'并将索引var暴露给模板。 – vaughan 2014-07-16 13:15:37

6

由于木偶2.0.0您可以用childViewOptions做功能:

var CollectionView = Marionette.CollectionView.extend({ 
    childViewOptions: function(model, index) { 
    // do some calculations based on the model 
    return { 
     foo: "bar", 
     childIndex: index 
    } 
    } 
}); 

由于木偶文档中解释了childViewOptions

相关问题