2013-10-31 2 views
0

У меня есть два приложения (больше нужно добавить, которые могут или не могут использовать базовые + requirejs), оба разработанные с использованием backbone + requirejs. Я хочу создать eventbus, на котором оба приложения могут публиковать и подписываться на определенные события. Я рассмотрел два варианта, оба из которых имеют свою собственную неэффективность. К ним относятся: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

Балка сама по себе, автобус событий. Скорее всего, это самый прямой способ сделать это.

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

Единственная проблема заключается в том, что оба приложения используют requirejs, который загружает файлы async и привязан к определенному контексту, поэтому, по сути, оба приложения могут загружать свою собственную версию магистрали. – stavarotti

Смежные вопросы