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

时间:2013-03-20 05:26:19

标签: marionette

我有一个CollectionView

class MyCollectionView extends Backbone.Marionette.CollectionView
  itemView: MyItemView

  itemViewOptions: ->
    {
      indexInCollection: ?
    }

我希望MyItemView知道其模型所在集合中的哪个索引。

我想,在MyItemView中,我可以通过

找到它
@model.collection.indexOf(@model)

但是有没有办法将它从Marionette CollectionView直接传递到MyItemView,使用一些内部Marionette机制?这个指数已经暴露在某个地方吗?

3 个答案:

答案 0 :(得分:12)

itemViewOptions,当设置为函数时,会收到itemmodel参数。使用它来查找索引:


class MyCollectionView extends Backbone.Marionette.CollectionView
  itemView: MyItemView

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

答案 1 :(得分:7)

自Marionette 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

的Marionette文档中所述

答案 2 :(得分: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
        }

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