我有两个应用程序(可能会或可能不会使用主干 + requirejs 的更多应用程序),它们都是使用主干 + requirejs 开发的。我想创建一个事件总线,两个应用程序都可以在其上发布和订阅特定事件。我考虑了两种选择,它们都有各自的低效率。这些包括:
- 使用文档对象,因为这对于页面上的所有应用程序都是通用的,无论框架/架构如何,例如:
// 聚合器
定义([],函数(){
var eventAgg = document.getElementsByTagName('body')[0],
slice = Array.prototype.slice;
函数 _on() {
var args = slice.call(arguments);
eventAgg.addEventListener(arg[0], arg[1]);
}
函数_触发器(){
var args = slice.call(arguments);
eventAgg.dispatchEvent(arg[0]);
}
返回 {
开:_开,
触发器:_trigger
};
});
// 在应用程序 1 的某个模块中的某处
定义(['jquery',
'下划线',
'骨干',
'派遣',
'someView'], function ($, _, Backbone, Dispatch, SomeView) {
...
Dispatch.on('init', function (e) {...};);
...
});
// 在应用程序 2 的某个模块中的某处
...
var customEvent = new CustomEvent('init', {'status': '所有数据加载成功'});
dispatcher.dispatchEvent(event);
...
- 扩展 Backbone.Events 并将事件聚合器注入所有 requirejs 模块(尽管这种方法充其量是挑剔的)。与上面相同的方法,除了我扩展 Backbone.Events 而不是使用文档对象。
对于提供全局事件聚合器,这些方法似乎都不“正确”,但我无法想出更好的方法。有什么建议么?