两个Requirejs应用程序的Eventbus / Aggregator

时间:2013-10-31 19:57:00

标签: javascript jquery backbone.js requirejs

我有两个应用程序(更多可能会或可能不会使用backbone + requirejs),都是使用backbone + requirejs开发的。我想创建一个eventbus,两个应用程序都可以在其上发布和订阅特定事件。我考虑了两个选项,两者都有自己的低效率。其中包括:

  • 使用文档对象,因为这对于页面上的所有应用程序都是通用的,无论框架/架构如何:
// Aggregator
define([], function () {
    var eventAgg = document.getElementsByTagName('body')[0],
        slice = Array.prototype.slice;

    function _on() {
        var args = slice.call(arguments);
        eventAgg.addEventListener(arg[0], arg[1]);
    }

    function _trigger() {
        var args = slice.call(arguments);
        eventAgg.dispatchEvent(arg[0]);
    }

    return {
        on: _on,
        trigger: _trigger
    };
});

// Somewhere in one of app 1's modules
define(['jquery', 
        'underscore', 
        'backbone', 
        'dispatch',
        'someView'], function ($, _, Backbone, Dispatch, SomeView) {

    ...
    Dispatch.on('init', function (e) {...};);
    ...
});

// Somewhere in one of app 2's modules

...
var customEvent =  new CustomEvent('init', {'status': 'All data loaded successfully'});
dispatcher.dispatchEvent(event);
...
  • 扩展Backbone.Events并将事件聚合器注入所有requirejs模块(尽管这种方法充其量只是挑剔)。与上面相同的方法,除了我扩展Backbone.Events而不是使用文档对象。

这两种方法对于提供全局事件聚合器似乎都不正确,但我还没有能够提出更好的方法。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

Backbone本身就是一个事件总线。这可能是最直接的做法。

Backbone.on('myevent:app1', function(){alert('sup');})
Backbone.trigger('myevent:app1');