2012-06-30 49 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到視圖。