私は 2 つのアプリケーション (バックボーン + requirejs を使用する場合と使用しない場合があります) を 2 つ持っており、どちらもバックボーン + requirejs を使用して開発されています。両方のアプリケーションが特定のイベントをパブリッシュおよびサブスクライブできるイベントバスを作成したいと考えています。私は 2 つの選択肢を検討しましたが、どちらにも非効率性があります。これらには以下が含まれます:
- これは、フレームワーク/アーキテクチャに関係なく、ページ上のすべてのアプリケーションに共通であるため、ドキュメント オブジェクトを使用します。
// アグリゲーター
define([], 関数 () {
var eventAgg = document.getElementsByTagName('body')[0],
スライス = Array.prototype.slice;
関数 _on() {
var args = slice.call(引数);
eventAgg.addEventListener(arg[0], arg[1]);
}
関数 _trigger() {
var args = slice.call(引数);
eventAgg.dispatchEvent(arg[0]);
}
戻る {
オン: _オン、
トリガー: _trigger
};
});
// アプリ 1 のモジュールの 1 つのどこかに
define(['jquery',
'アンダースコア',
'背骨'、
'急送'、
'someView'], 関数 ($, _, バックボーン, ディスパッチ, SomeView) {
...
Dispatch.on('init', 関数 (e) {...};);
...
});
// アプリ 2 のモジュールの 1 つのどこかに
...
var customEvent = new CustomEvent('init', {'status': 'すべてのデータが正常にロードされました'});
dispatcher.dispatchEvent(イベント);
...
- Backbone.Events を拡張し、すべての requirejs モジュールにイベント アグリゲーターを挿入します (ただし、このアプローチはせいぜい厄介でした)。ドキュメント オブジェクトを使用する代わりに Backbone.Events を拡張する以外は、上記と同じアプローチです。
これらの方法はどちらも、グローバル イベント アグリゲータを提供するのに「正しい」ようには見えませんが、私はそれ以上のものを思いつくことができませんでした。助言がありますか?