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

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

我已经为木偶拿了approach used here,但是由于我还没有使用木偶,所以我已经对其进行了调整,以使用无聊的旧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对象,并且 View 可以触发事件。

但是...路由器和 View 如何看待同一对象?并非每次在其他模块需要时,vent.js中的return _.extend({}, Backbone.Events);总是会返回一个新对象吗?

是否有关于RequireJS的我没有得到的东西,或者_.extendBackbone.Events做了什么,还是关于JavaScript的一些(其他)我没有完全理解的东西?

最佳答案

在AMD中,define回调仅执行一个。其结果将在所有相关模块中使用。结帐this帖子。我认为您的问题与此有关。

09-17 06:42