Марионетка.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;
  },

для получения дополнительной информации см.:


начиная с марионетки 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.вент для просмотра.