【问题标题】:Centralising the Backbone Event Aggregator in RequireJS - how does this work?在 RequireJS 中集中化主干事件聚合器 - 这是如何工作的?
【发布时间】:2014-01-27 17:11:52
【问题描述】:

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

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

我已经为 Marionette 使用了 approach used here,但由于我还没有使用 Marionette,所以我已经对其进行了调整以使用无聊的旧 vent 对象:

vent.js

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

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

enquiry-list-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);
        }
    });
});

app-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 的事情我没有得到,或者是 _.extendBackbone.Events 做了什么,或者我不完全了解 JavaScript 的某些(其他)?

【问题讨论】:

    标签: javascript backbone.js requirejs eventaggregator


    【解决方案1】:

    在 AMD 中,定义回调只执行那些。它的结果用于所有依赖模块。结帐this 帖子。我认为您的问题与此有关。

    【讨论】:

    • 太棒了,感谢您清除它。一百万个脱钩的想法刚刚在我眼前闪过。 RequiresJS 是个好东西 :)
    猜你喜欢
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多