在RequireJS中集中Backbone Event Aggregator - 这是如何工作的?

时间:2014-01-27 17:11:52

标签: javascript backbone.js requirejs eventaggregator

我正在使用RequireJS编写一个Backbone应用程序来定义模块。我已经达到了如何传递事件聚合器而不使用全局变量或将其作为参数传递到每个视图中的古老问题。

vent = _.extend({}, Backbone.Events);

我已经把approach used here用于木偶,但由于我还没有使用木偶(我),我已经将它改编成使用枯燥的旧vent对象:

vent.js

define(['underscore', 'backbone'], function (_, Backbone) {
    return _.extend({}, Backbone.Events);
});

所以现在在我的各种模块中,我可以发布和订阅,例如:

查询一览view.js

define(['backbone', 'vent'], function (Backbone, vent) {

    var EnquiryListView = Backbone.View.extend({

        events: {
            'click .enquiry-list-item-manage': 'manageClick'
        },

        manageClick: function () {
            vent.trigger('navigate', 'enquiry/' + id);
        }
    });
});

应用-router.js

define(['backbone', 'vent'], function (Backbone, vent) {

    var AppRouter = Backbone.Router.extend({
        routes: {
            'enquiry/:id': 'enquiryManage'
        },

        initialize: function () {
            //listen out for navigate events
            this.listenTo(vent, 'navigate', this.gotoRoute);
        },

        gotoRoute: function (route) {
            this.navigate(route, { trigger: true });
        }
    });

这种模式似乎没问题,路由器可以监听vent对象,视图可以触发事件。

但是......路由器和视图如何看待同一个对象?在每个不同模块需要时,vent.js中的return _.extend({}, Backbone.Events);是否总是返回一个新对象?

我有没有得到一些关于RequireJS的内容,或者_.extend正在对Backbone.Events做些什么,或者是否有一些关于JavaScript的东西(其他)我还不完全理解?< / p>

1 个答案:

答案 0 :(得分:5)

在AMD中,定义回调只执行一次。其结果用于所有相关模块。结帐this发布。我认为你的问题与它有关。