2013-10-31 53 views
0

我有兩個應用程序(更多可能會添加,可能會或可能不會使用backbone + requirejs),都是使用backbone + requirejs開發的。我想創建一個事件總線,在這兩個應用程序可以發佈和訂閱特定事件。我考慮過兩種選擇,這兩種選擇都有其自身的低效率。這些措施包括:兩個Requirejs應用程序的Eventbus/Aggregator

  • 使用文檔對象,因爲無論框架/架構例如,這是常見的網頁上的所有應用程序:
 
// 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

骨幹本身就是一個事件總線。這可能是最直接的做法。

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

這裏唯一的問題是,這兩個應用程序正在使用它加載文件異步並綁定到特定的語境requirejs所以在本質上是這兩個應用可以加載自己的骨幹網的版本。 – stavarotti