5

私は Backbone と数日間一緒に仕事をしてきました。デザイン パターンなどについて調べています。今日、たくさんのリソースを読んだ後、サブビューをいじっていました。主に、この2つの投稿-

デリック・ベイリー
http://lostechies.com/derickbailey/2011/09/15/zombies-run-managing-page-transitions-in-backbone-apps/

イアン・ストーム・テイラー
http://ianstormtaylor.com/assigning-backbone-subviews -さらにきれいに/

これらおよび他のものは、いくつかのサブビューをセットアップし、正しいパターンであると思われるものでそれらを閉じるのを処理するのに非常に役立ちました。

Backbone.View.prototype.close = function(){
    var ctx = this;
    _.each(ctx.subViews(), function(view) {
        view.close();
    });
    this.remove();
    this.unbind();
}

ここで問題はありません。私が期待したことをしているようです。しかし、何が起こったのかを確認するために、テストしたかったのです。そこで、subViews で close を呼び出すのをやめ、レンダーを 20,000 回ループしました。

Backbone.View.prototype.close = function(){
    var ctx = this;
    _.each(ctx.subViews(), function(view) {
        //view.close();
    });
    this.remove();
    this.unbind();
}

ここにはゾンビ イベント ハンドラや DOM ノードはありません。これは私にとって少し驚きでした。私は jQuery の内部構造の専門家ではなく、少なくとも子ノードからのイベント ハンドラーがまだあることを期待していました。しかし、私のサブビューはすべて親ビューに含まれており、まだ削除されてバインドされていないため、jQuery はすべての子を正常にクリアしていると思います。だから私は親要素のアンバインドをやめました:

Backbone.View.prototype.close = function(){
    var ctx = this;
    _.each(ctx.subViews(), function(view) {
        //view.close();
    });
    this.remove();
    //this.unbind();
}

Chrome インスペクターのイベント ハンドラーの数がまだ増えません。

だから私の質問は:

この方法でイベントのバインド解除とサブビューを巧みに処理する必要がある場合の「実際の」例は何ですか? ビューの直接の範囲外のオブジェクト参照ですか? サブビューが親ビューの $el に含まれていない場合のみですか?

4

1 に答える 1

3

DOM から親ビューを削除すると、jQuery は、子にフックされたすべての DOM イベントをクリーンアップします。 unbind()は Backbone の のエイリアスでEvents.off、 を使用して接続した可能性のあるイベントをすべて削除しますmyChildView.on('someEvent', ...)。たとえば、親ビューは、子ビュー内でトリガーするイベントをリッスンする場合があります。その場合、this.unbind()またはへの呼び出しが必要になりますthis.off()

Backbone.Events (0.9.9 現在) にlistenTo()stopListening()があるので、 に追加することを検討できthis.stopListening()ますclose()。次に、ビュー内で、this.listenTo(this.model, ...)それらも適切にクリーンアップされるようなものを使用した場合。

于 2013-01-30T23:50:18.710 に答える