Jquery关闭不删除Ember应用程序中的事件处理程序

时间:2016-01-04 10:10:59

标签: javascript jquery ember.js

我无法通过使用off来从ember应用程序中删除事件处理程序。

我的处理函数是

setClickEvent: function(){
  var panel = this.$();
  if(panel && panel.find(event.target).length === 0 && this.get('isOpen')){
    this.send('cancel');
  }
}

我使用下面的代码

didInsertElement函数中调用此函数
didInsertElement: function(){
  Ember.$('body').on('click', Ember.run.bind(this, this.setClickEvent));
}

并在off函数中调用willDestroyElement,如下所示

willDestroyElement: function(){
  Ember.$('body').off('click', this.setClickEvent);
  this._super();
}

我尝试了解与之相关的许多stackoverflow问题。建议在on之后放置一个空的off,我尝试了但是它没有用。

问题在于,每当我离开页面并返回时,我发现两个处理程序处理相同的事件,因为前一个事件处理程序没有被删除,事件处理程序正在堆积。

1 个答案:

答案 0 :(得分:3)

这实际上与实际上没有关系。问题在于这一部分:

Ember.run.bind(this, this.setClickEvent)

它的作用是bind创建一个绑定到this新函数。然后将该新函数作为处理程序附加。但是,您尝试off()原始setClickEvent而不是新功能。

尝试在创建对象时绑定函数并将其存储以供以后使用:

init: function () {
  this._super();
  this._setClickEvent = Ember.run.bind(this, this.setClickEvent);
}

然后在didInsertElementwillDestroyElement中,直接使用绑定功能this._setClickEvent

必须为off提供确切的函数on,否则它将无法在其观察者列表中找到它并且不会将其删除。