2012-06-30 13 views
21

Me gustaría acceder al app.vent de Marionette.ItemView.Marionette.CompositeView, cómo pasar parámetros a Marionette.ItemView

Quizás una opción podría ser pasar un parámetro (app.vent) a Marionette.ItemView desde Marionette.CompositeView.

Aquí mi código:

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

¿Alguna idea?

P.S .:
No puedo acceder a la aplicación desde itemView porque hay un problema de dependencia circular.

app -> view/compositeView -> view/itemView 

Respuesta

29

v0.9 agregaron un atributo itemOptions que se puede utilizar para esto. Puede ser un objeto literal o una función que devuelve un objeto literal.



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

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

}); 

Todas las key: "value" pares que son devueltos por este atributo será suministrado a las opciones del itemview en teh inicializador


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

Además, si necesita ejecutar código específico para cada instancia itemView que es construido, puede anular el método buildItemView para proporcionar una creación personalizada de la vista del elemento para cada objeto en la colección.


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

Para obtener más información, véase:

+7

_itemViewOptions_ ya no se usa, debe usar _childViewOptions_ ahora. – DiegoG

13

Desde Marionette v2.0.0, childViewOptions se utiliza en lugar de itemViewOptions para pasar parámetros a la vista de los niños:

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

Pero para trabajar con eventos, permite utilizar Marionette.Radio en lugar de pasar app.vent a la vista.

Cuestiones relacionadas