事件发生两次

我宣布这样的一个视图:

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

下一篇: Write a file to "Sector 0" using C#?