多くのビュー/モデルとコレクションを持つ非常に複雑なバックボーン アプリケーションがあります。
ユーザーがボタンをクリックすると、複数のコレクションを更新し、特定のビューを更新する必要があります。
コレクションを管理するために、ルーターでほとんどのイベントを処理しました。イベントのシーケンスは次のとおりです。
ユーザーがリンク/ボタンをクリックすると、ビューがイベントをトリガーします。
this.model.trigger('someEvent');
イベントをリッスンしているモデルは、必要に応じて自分自身を更新し、イベントバスを介してルーターに通知します
eventbus.trigger('globalEVent');
ルーターはグローバル イベントをリッスンし、キャッシュ ストレージからコレクション/モデルを取得し、必要なコレクションとモデルを更新します。
これはこれまでのところ非常にうまく機能していますが、
イベントが多すぎて、ルーター コードの管理が難しくなっています。私の質問は、ルーターの外部でイベントを処理し、ルーター内のメソッドにアクセスする方法はありますか? 私のアプローチは正しいですか、それとも私が考慮していないよりエレガントなソリューションがありますか?
アップデート:
これが私が今それを行う方法です:
Router では、initialize() でこのメソッドを呼び出します。
registerModules : function() {
var self = this;
Backbone.trigger(Events.RegisterModule, function(moduleRoutes) {
_.each(moduleRoutes, function(moduleRoute) {
self.routeDetails[moduleRoute.name] = {
buildPageUrl: moduleRoute.buildPageUrl,
fragment : moduleRoute.fragment
}
self.route(moduleRoute.fragment, moduleRoute.name, moduleRoute.action);
});
});
},
次に、自己登録するモジュール/ページごとに通常の自己実行ブロックがあります (簡易版):
(function() {
var module = {
loadAndDisplay: function() {},
saveAndContinue: function(model) {
Backbone.trigger(Events.ChangePage, model.get('nextPage'));
},
registerEvents: function() {},
_init: function() {
module.registerEvents();
var self = this,
routes = [{
fragment: Constants.FRAGMENT,
name: Constants.PAGE_NAME,
buildPageUrl: function() {
return Constants.FRAGMENT;
},
action: module.loadAndDisplay
}];
Backbone.on(Events.RegisterModule, function(registerCallback) {
registerCallback.call(registerCallback, routes);
});
}
};
module._init();
})();
もちろん、ルーター スクリプトはモジュール コードの前にロードする必要があります。それは私のニーズに最適です。この設計では、ルーターとモジュールを完全に分離しており、お互いの知識もありません。それぞれが独自のイベント/データなどを処理します。共有ロジックはルーターに入ります。