2012-06-30 8 views
21

Chciałbym uzyskać dostęp do app.vent z Marionette.ItemView.Marionette.CompositeView, jak przekazać parametry do Marionette.ItemView

Być może opcja może być przekazanie parametru (app.vent) do Marionette.ItemView z Marionette.CompositeView.

Oto mój kod:

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

Jakieś pomysły?

P.S .:
Nie mogę uzyskać dostępu do aplikacji z itemView, ponieważ występuje problem zależności cyklicznej.

app -> view/compositeView -> view/itemView 

Odpowiedz

29

v0.9 dodał atrybut itemOptions, który można wykorzystać do tego. Może to być literał obiektowy lub funkcja, która zwraca literał obiektu.



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

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

}); 

Wszystkie key: "value" par, które są zwracane przez tego atrybutu zostaną dostarczone do opcji na itemview w teh inicjatora


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

Dodatkowo, jeśli trzeba uruchomić kod specyficzny dla każdej instancji itemView który jest zbudowany, można zastąpić metodę buildItemView, aby zapewnić niestandardowe tworzenie widoku elementów dla każdego obiektu w kolekcji.


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

Aby uzyskać więcej informacji, patrz:

+7

_itemViewOptions_ nie jest już używany, musisz teraz użyć _childViewOptions_. – DiegoG

13

od Marionette v2.0.0, childViewOptions jest używany zamiast itemViewOptions przekazać parametry do widoku dziecięcej:

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

Ale do pracy z wydarzeń, pozwala używać Marionette.Radio zamiast przechodzenia app.vent do widoku.