Подтвердить что ты не робот

Marionette.CompositeView, как передать параметры Marionette.ItemView

Я хотел бы получить доступ к app.vent из Marionette.ItemView.

Может быть, вариант может состоять в том, чтобы передать параметр (app.vent) в Marionette.ItemView из Marionette.CompositeView.

Здесь мой код:

// 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
4b9b3361

Ответ 1

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;
  },

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

Ответ 2

Поскольку 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 в представление.