事件发生两次
我宣布这样的一个视图:
var VirtualFileSelectorView = Backbone.View.extend({
selected: function() {
console.log("selected function");
},
initialize: function() {
// Shorthand for the application namespace
var app = brickpile.app;
// bind to the selected event
app.bind('selected', this.selected, this);
}
});
然后我实例化这个视图的两个实例,就像你在这里看到的:http://cl.ly/H5WI
问题是当选择的事件被触发时,选择的功能被调用两次?
阅读完评论主题后,我想我已经了解如何才能解决您的问题:
在你的代码中,两个视图都在监听同一个全局事件,所以它们都会同时响应,并且你希望能够独立地触发每个视图的selected()
。
通常的做法是View与Model相关联,并且View正在侦听该Model上的事件,因此仅触发一个Model的事件将影响与其关联的Views。
这种模式看起来像这样:
// code simplified and not tested
var MyView = Backbone.View.extend({
initialize: function( opts ){
this.model = opts.model;
this.model.on( "selected", this.selected, this );
},
selected: function( model ){
// ...
}
})
var oneModel = new MyModel();
var oneView = new MyView({ model: oneModel });
现在您只需在需要时照顾触发每个模型上的selected
事件。
更新
这种模式非常常见,Backbone将View.model
引用关联给你,所以你可以像这样实现你的View.initialize
:
initialize: function(){
this.model.on( "selected", this.selected, this );
}
正如你已经声明了VirtualFileSelectorView
两个实例,你有两个观察者选择了事件。
即使您正在重新使用旧View实例的引用来引用新的View实例,旧实例仍保持活动状态,因为仍然存在以它为目标的引用。
这在Backbone中是一个非常普遍的问题,我认为人们开始称之为“幽灵视图”。
为了解决这个问题,你必须unbind
视图unbind
所有事件,在你的例子中你可以这样做:
app.virtualFileSelectorView.off( null, null, this );
Derick Bailey在这件事上发表了一篇很好的文章。
另外,我要谦虚地将一篇关于这件事的研究连接起来,试图理解这种顽强的行为。
链接地址: http://www.djcxy.com/p/10813.html上一篇: Event fires twice