この設定を使用して、イベントの登録と登録解除を行います。
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/