Марионетка.CompositeView, как передать параметры марионетке.ItemView
Я хотел бы получить доступ к приложению.отдушина от марионетки.ItemView.
возможно, можно было бы передать параметр (app.vent
) к Marionette.ItemView
С Marionette.CompositeView
.
вот мой код:
// view/compositeView.js
define([
'marionette',
'views/item'
], function (Marionette, itemView) {
var ListView = Marionette.CompositeView.extend({
itemView: itemView
});
});
какие идеи?
П. С.:
Я не могу получить доступ к приложению из itemView, потому что существует проблема циклических зависимостей.
app -> view/compositeView -> view/itemView
2 ответов
версия v0.9 добавил itemOptions
атрибут, который можно использовать для этого. Это может быть либо объектный литерал, либо функция, возвращающая объектный литерал.
Backbone.Marionette.CompositeView.extend({
itemView: MyItemViewType,
itemViewOptions: {
some: "option",
goes: "here"
}
});
все key: "value"
пары, возвращаемые этим атрибутом, будут предоставлены параметрам itemview в инициализаторе
Backbone.Marionette.ItemView.extend({
initialize: function(options){
options.some; //=> "option"
options.goes; //=> "here"
}
});
кроме того, если вам нужно запустить определенный код для каждого построенного экземпляра itemView, вы можете переопределить 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;
},
для получения дополнительной информации см.:
- журнал изменений для v0.9
- документация CollectionView для itemViewOptions - обратите внимание, что CompositeView простирается от CollectionView, поэтому все документы CollectionView действительны и для CompositeView
- аннотированный исходный код buildItemView
начиная с марионетки 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});
но для работы с событиями, позволяет использовать марионеток.Радио вместо app.вент для просмотра.