2013-02-14 39 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框架,并发现它在创建模块化,易于维护的代码方面非常有用,并且已经处理了很多通常可用的代码。