20

GWTに由来するバックボーンは、ビューのライフサイクルを処理する方法に関する組み込みのソリューションを見逃しているようです。GWTでは、バックボーンのビューとほぼ同等のすべてのアクティビティは、アクティビティでonStart / onStopを呼び出し、eventBusとアクティビティをレンダリングできる要素を渡すActivityManagerによって管理されます。 ActivityManagerは、アクティビティがイベントバスにバインドしているすべてのイベントのバインドを解除し、DOMからビューを削除します。

バックボーンでは、イベントをモデルとコレクションにバインドするのは簡単ですが、手動で削除する必要があり、これを行う一般的なapiメソッドはありません。

そのため、ビューを管理して、強制終了または無効化されたビューがイベントを不要にリッスンしないようにするためのベストプラクティスパターンを探しています。

4

4 に答える 4

13

そうです、それに対するソリューションは組み込まれていません(まだ)。

ただし、バックボーンを拡張してこの機能を提供することはもちろん可能です。最近、Derick Bailey がこれについてブログ投稿を書いています。

こちらをご覧ください: http://lostechies.com/derickbailey/2011/09/15/zombies-run-managing-page-transitions-in-backbone-apps/

これは決して聖杯ではありません。自由に実装できますが、ゾンビビューを処理するための非常に簡単なアプローチです。メモリ内をクロールする他のクリーチャーの世話をする必要がありますが、これは少なくともビューから始めましょう!

于 2011-12-02T01:20:03.617 に答える
5

Backbone の remove メソッドを拡張するカスタム BaseView を使用しています。

app.BaseView = Backbone.View.extend({

    views: [], // array to keep a ref of child-views for proper disposal later on

    remove: function() {

        // dispose any sub-views
        _.each(this.views || [], function(view) {
            view.remove();
        });

        // if the inheriting class defines a custom on-remove method, call it!
        _.isFunction(this.onRemove) && this.onRemove();

        // unbind all events from this view
        this.off();

        // finally, call Backbone's default remove method to
        // remove the view from the DOM
        Backbone.View.prototype.remove.call(this);
    }
}

まだ問題があります。モデルとコレクションは、他のビューでも使用されているかどうかわからないため、手動で破棄する必要があります。

于 2012-03-25T03:01:27.723 に答える
3

Marionetteついに私が探していた機能を備えているようです。

于 2012-07-06T20:46:26.040 に答える
2

ビューを管理するソリューションをhttps://github.com/thomasdao/Backbone-View-Managerに投稿します。

ビュー マネージャーは、新しいビューを作成する前に常に既存のビューをクリーンアップします。次に、次の方法で新しいビューを初期化します。

newView = VM.createView("newView", function(){
             return new View();
          };

新しいビューを作成する代わりにビューを再利用したい場合は、

newView = VM.reuseView("newView", function() {
              return new View();
          }

VM.reuseView と VM.createView の違いは、reuseView は「newView」という名前の既存のビューを探し、見つかった場合は返されることです。それ以外の場合は、コールバック関数を実行して結果をキャッシュします。VM.createView は常にコールバック関数を実行し、既存のビューをクリーンアップします。したがって、ビューが動的で頻繁に変更される場合は、VM.createView を使用することをお勧めします。

于 2012-04-26T09:42:39.927 に答える