让我们使用这个设置来注册和注销事件:
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/
缩略图视图中设置的回调被保留,而主视图中设置的回调被删除。请注意,teardown 方法可以并且可能应该用于取消委托 DOM 事件。
另一个小提琴,其中主视图中的模型被替换而不是破坏/重新创建视图http://jsfiddle.net/9xufW/2/