У меня есть два приложения (больше нужно добавить, которые могут или не могут использовать базовые + 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 вместо использования объекта документа.
Ни один из этих методов не кажется «правильным» для обеспечения глобального агрегатора событий, но я не смог придумать ничего лучшего. Какие-либо предложения?
Единственная проблема заключается в том, что оба приложения используют requirejs, который загружает файлы async и привязан к определенному контексту, поэтому, по сути, оба приложения могут загружать свою собственную версию магистрали. – stavarotti