6

我有一个 CollectionView

class MyCollectionView extends Backbone.Marionette.CollectionView
  itemView: MyItemView

  itemViewOptions: ->
    {
      indexInCollection: ?
    }

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

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

@model.collection.indexOf(@model)

但是有没有办法使用一些内部 Marionette 机制将它从我的 Marionette CollectionView 直接传递到 MyItemView 中?这个索引是否已经暴露在某个地方?

4

3 回答 3

12

,itemViewOptions当设置为函数时,接收一个itemormodel参数。使用它来查找索引:


class MyCollectionView extends Backbone.Marionette.CollectionView
  itemView: MyItemView

  itemViewOptions: (model) ->
    {
      indexInCollection: this.collection.indexOf(model)
    }
于 2013-03-20T13:59:00.543 回答
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 文档中所述

于 2015-04-01T23:44:49.670 回答
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
        }

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

于 2013-11-26T14:26:47.303 回答