我正在构建一个 Backbone 应用程序,使用 require.js 进行模块化加载,并使用 Marionette 来帮助我的应用程序结构和功能。我已经为事件聚合器设置了一个 require 模块,如下所示:-
define(['backbone', 'marionette'],function(Backbone, Marionette){
var ea = new Backbone.Wreqr.EventAggregator();
ea.on('all', function (e) { console.log("[EventAggregator] event: "+e);});
return ea;
});
我希望将它传递到我的其他 require 模块中,并让它充当中央事件处理和消息传递组件,我在这方面取得了一些成功。我可以将通风口作为依赖项传递给其他模块,而不会出现这样的问题:-
define(['marionette', 'text!templates/nav.html', 'shell/vent'], function (Marionette, text, vent) {
return SplashView = Marionette.ItemView.extend({
template : text,
events : {
'click #splashContinueButton': 'onButtonClick'
},
onButtonClick : function(evt) {
vent.trigger('onSplashContinueClick');
}
});
});
我遇到的问题是,尽管所有事件都在我的应用程序的不同位置触发(我可以在控制台日志中看到),但我无法在我的应用程序的某些部分收听它们。例如,我有一个 Marionette 模块(在运行时作为 require 模块加载),它试图获取一些这样的事件:-
var SplashModule = shellApp.module("SplashModule");
SplashModule.addInitializer(function(){
vent.on("onSplashModelLoaded", this.onSplashModelLoaded);
vent.on("onSplashContinueClick", this.onSplashContinueClick);
}
我什么也没得到,即使我从这个地方记录通风口,我也可以将它视为一个对象。在日志中,它包含一个事件数组,实际上只包含根级应用程序正在侦听的事件,而不是应用程序其他部分正在侦听的任何其他事件。这就是我的理解分崩离析的地方:我认为我可以将事件聚合器用作跨应用程序结构的全局通信和消息传递系统。任何人都可以对可能发生的事情有所了解吗?
非常感谢,
山姆
*更新/编辑/解决方案*
您好,好吧,我现在可以正常工作了(发布上述内容后仅 5 分钟-doh!)。基本上,在模块的初始化事件中添加我的监听器为时过早(据我所知)。我将它们沿着功能链进一步移动,现在一切都按预期运行。