2012-06-30 41 views
21

我想从Marionette.ItemView中访问app.vent。Marionette.CompositeView,如何将参数传递给Marionette.ItemView

也许一个选项可能是从Marionette.CompositeView传递参数(app.vent)到Marionette.ItemView

这里我的代码:

// view/compositeView.js 
define([ 
    'marionette', 
    'views/item' 
], function (Marionette, itemView) { 
    var ListView = Marionette.CompositeView.extend({ 
     itemView: itemView 
    }); 
}); 

任何想法?

P.S .:
我无法从itemView访问应用程序,因为存在循环依赖问题。

app -> view/compositeView -> view/itemView 

回答

29

v0.9增加了一个可用于此的itemOptions属性。它可以是对象字面量,也可以是返回对象字面量的函数。



Backbone.Marionette.CompositeView.extend({ 
    itemView: MyItemViewType, 

    itemViewOptions: { 
    some: "option", 
    goes: "here" 
    } 

}); 

所有由该属性返回将被提供给ItemView控件的选项,在格兰初始化


Backbone.Marionette.ItemView.extend({ 
    initialize: function(options){ 
    options.some; //=> "option" 
    options.goes; //=> "here" 
    } 
}); 

此外,如果你需要为每个ItemView控件实例,它是运行特定代码key: "value"对可以覆盖buildItemView方法为集合中的每个对象提供项目视图的自定义创建。


    buildItemView: function(item, ItemView){ 

    // do custom stuff here 

    var view = new ItemView({ 
     model: item, 
     // add your own options here 

    }); 

    // more custom code working off the view instance 

    return view; 
    }, 

欲了解更多信息,请参见:

+7

_itemViewOptions_不再使用,您现在必须使用_childViewOptions_。 – DiegoG

13

由于Marionette v2.0.0,childViewOptions用来代替itemViewOptions将参数传递给子视图:

var MyCompositeView = Marionette.CompositeView.extend({ 
    childView: MyChildView, 
    childViewOptions: function(model, index) { 
    return { 
     vent: this.options.vent 
    } 
    } 
}); 

var MyChildView = Marionette.ItemView.extend({ 
    initialize: function(options) { 
     // var events = options.vent; 
    } 
}); 

new MyCompositeView({ vent: app.vent, collection: myCollection}); 

但随着事件的工作,让使用Marionette.Radio强似app.vent到视图。