1

多くのビュー/モデルとコレクションを持つ非常に複雑なバックボーン アプリケーションがあります。

ユーザーがボタンをクリックすると、複数のコレクションを更新し、特定のビューを更新する必要があります。

コレクションを管理するために、ルーターでほとんどのイベントを処理しました。イベントのシーケンスは次のとおりです。

ユーザーがリンク/ボタンをクリックすると、ビューがイベントをトリガーします。

 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();    

})();

もちろん、ルーター スクリプトはモジュール コードの前にロードする必要があります。それは私のニーズに最適です。この設計では、ルーターとモジュールを完全に分離しており、お互いの知識もありません。それぞれが独自のイベント/データなどを処理します。共有ロジックはルーターに入ります。

4

1 に答える 1

1

ルーターの機能をさまざまなクラスに分割する必要があります。Marionette ベースのアプリケーションでは、RegionManager を使用して、さまざまな領域でビューを変更したり、オーバーレイを開いたり、StateMachine を開いたりするなど、ビューに関連するすべてのものを処理します。ルーター自体は、マネージャー クラスがリッスンする state:change や region:change などのさまざまなイベントをトリガーするだけです。

このようにすると、アプリの特別な側面を処理するさまざまなマネージャー クラスを使用できます。ルーターを構築する目的に合わせます。場所の変更イベントをリッスンし、それについてアプリに通知します。ルーターには、これ以外のロジックがあってはなりません。

于 2012-09-14T19:13:08.790 に答える