backbone.js Backbone.Events原型路由器事件聚合

时间:2013-02-14 17:09:02

标签: javascript backbone.js client-side singlepage

在Backbone.js中我的路由器可以使用eventAggregator (Backbone.View.prototype.eventAggregator = _.extend({}, Backbone.Events);)对象的最佳方法是什么,而不将其作为参数传递。

我有一个mainController(一个没有渲染的视图),我正在实例化Backbone.View.prototype.eventAggregator

我也在mainController中创建我的路由器,但只有View会有eventAggregator而不是路由器。

我不想再往前走,做Backbone.prototype.eventAggregator以便路由器可以拥有它。有没有更简洁的方法呢?

2 个答案:

答案 0 :(得分:2)

Backbone已经内置了你可以使用的东西(来自Backbone源代码):

  // 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 :(得分:1)

正如Paul所提到的,所有骨干对象(包括路由器)都扩展了Event对象,因此您可以在这些对象上设置事件侦听器。但我明白为什么要集中管理事件,这样就不需要在各种对象上设置事件监听器,也不需要传递事件聚合器。

Derick Bailey在下面的帖子中谈到了这一点,他提出的解决方案是创建一个App级事件聚合器。

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

另外,如果您正在做比“待办事项”应用程序更复杂的事情,我建议您查看一些Backbone框架,例如Chaplin,Marionette,样板等。您可以找到列表{{3 }}

在我的应用程序中,我使用的是Marionette框架,并发现它在创建模块化,易于维护的代码时非常有用,并且已经处理了很多通常的重复代码。