1

Backbone.js でギャラリーのようなピッカー ビューを構築しています。ピッカーには、コレクション内のモデルにバインドされた多くのサムネイル ビューと、現在選択されているサムネイルの大きなプレビュー ビューがあります。サムネイルをクリックすると、Backbone.Event が起動され、プレビュー ビューのモデルが変更されます。ただし、プレビュー ビューでは、モデルのいくつかのバックボーン イベントがモデルの属性に応じて状態が変化することを観察します。

旧機種でバックボーンイベントの登録を解除し、新機種で同じイベントを再登録するのが面倒です。私は常に元の.on()登録を参照しているわけではなく、モデルのすべてのイベントを登録解除するために単純に呼び出しthis.model.off()たいと思っています (ただし、モデルが持つ可能性のある他のイベントを破棄したくはありません)。Backbone.js のドキュメントでは、呼び出し.off(null, null, context)によって現在のコンテキスト内のオブジェクトからイベントが登録解除されると概説されています。ただし、これにより現在のビュー インスタンスだけのすべてのイベントが登録解除されるかどうかはわかりません。

4

1 に答える 1

6

この設定を使用して、イベントの登録と登録解除を行います。

var ThumbView=Backbone.View.extend({
    initialize: function() {
        this.model.on("change:title", this.log, this);
    },

    log:function(model) {
        console.log("Thumb view : "+model.get("id")+" : "+model.get("title"));
    }
});

var MainView=Backbone.View.extend({
    initialize: function() {
        this.model.on("change:title", this.log, this);
    },

    log:function(model) {
        console.log("Main view : "+model.get("id")+" : "+model.get("title"));
    }
});

var m1=new Backbone.Model({id:1,title:"m1"});   
var t=new ThumbView({model:m1});
var v=new MainView({model:m1});

m1.set({title:"m1, 1"});
v=new MainView({model:m1});
m1.set({title:"m1, 2"});

現状では、新しいMainViewを作成しても、以前のバインディングは破棄されず、ゾンビビューになります。最後の3行は、次の結果になります。

サムビュー:1:m1、1
メインビュー:1:m1、1サムビュー
:1:m1、2
メインビュー:1:m1、2
メインビュー:1:m1、2

付随するフィドル: http: //jsfiddle.net/9xufW/

off特定のコンテキストでメソッドをテストしてみましょう。

var MainView=Backbone.View.extend({
    initialize: function() {
        this.model.on("change:title", this.log, this);
    },

    log:function(model) {
        console.log("Main view : "+model.get("id")+" : "+model.get("title"));
    },

    teardown: function() {
        this.model.off(null, null, this);
    }
});

呼び出し

m1.set({title:"m1, 1"});
v.teardown(); // "destroys" the old view

v=new MainView({model:m1});
m1.set({title:"m1, 2"});

期待される結果が得られます

サムビュー:1:m1、1
メインビュー:1:m1、1サムビュー
:1:m1、2
メインビュー:1:m1、2

http://jsfiddle.net/9xufW/1/

サムビューで設定されたコールバックは保持されますが、メインビューで設定されたコールバックは削除されます。分解メソッドは、DOMイベントの委任を解除するために使用でき、おそらく使用する必要があることに注意してください。

ビューを破棄/再作成する代わりに、メインビューのモデルが置き換えられる別のフィドルhttp://jsfiddle.net/9xufW/2/

于 2012-06-11T13:09:32.820 に答える