2

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

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

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

我不想走得更远,做 Backbone.prototype.eventAggregator 以便路由器可以拥有它。有更清洁的方法吗?

4

2 回答 2

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

或者反过来取决于你想要做什么。

于 2013-02-14T18:29:16.303 回答
1

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

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

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

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

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

于 2013-02-14T20:51:30.733 回答