2013-02-14 46 views
2

什麼是最好的方式使這個eventAggregator (Backbone.View.prototype.eventAggregator = _.extend({}, Backbone.Events);)對象可用於我的路由器在Backbone.js而不傳遞它作爲參數。backbone.js Backbone.Events原型路由器事件聚合

我有一個mainController(一個沒有渲染的視圖),我正在實例化Backbone.View.prototype.eventAggregator

我也在mainController裏面創建我的路由器,但只有View的將有eventAggregator而不是路由器。

我不想走得更遠,做Backbone.prototype.eventAggregator,以便路由器可以擁有它。有沒有更乾淨的方式來做到這一點?

回答

2

骨幹有這樣的事情已經建成,你可以使用(從骨幹源):

// Allow the `Backbone` object to serve as a global event bus, for folks who 
    // want global "pubsub" in a convenient place. 
    _.extend(Backbone, Events); 

然後在路由器:

Backbone.trigger('something'); 

,並考慮:

this.listenTo(Backbone, 'something', this.someMethod); 

或其他方式取決於你正在嘗試做什麼。

1

正如Paul所說的,所有的主幹對象,包括Router,都有Event對象的擴展,所以你可以在這些對象上設置事件監聽器。但我明白你爲什麼要集中管理事件,所以你不需要在各種對象上設置事件監聽器,或者傳入事件聚合器。

Derick Bailey在下面的帖子中談到了這個問題,他提出的解決方案是創建一個應用級事件聚合器。

http://lostechies.com/derickbailey/2012/04/03/revisiting-the-backbone-event-aggregator-lessons-learned/

此外,如果你正在做的事情比「待辦事項」應用程序比較複雜,我會鼓勵你看一些骨幹框架,像卓別林,木偶,樣板等,您可以找到列表here

在我的應用程序中,我使用了Marionette框架,並發現它在創建模塊化,易於維護的代碼方面非常有用,並且已經處理了很多通常可用的代碼。