Ember.js 如何删除余烬中的事件侦听器
我想在Ember中的keydown事件组件中设置一个事件侦听器。事件监听器被正确添加,但我似乎无法删除它,因为removeEventListener在另一个函数中传递。任何关于如何正确设置的帮助都将不胜感激Ember.js 如何删除余烬中的事件侦听器,ember.js,addeventlistener,Ember.js,Addeventlistener,我想在Ember中的keydown事件组件中设置一个事件侦听器。事件监听器被正确添加,但我似乎无法删除它,因为removeEventListener在另一个函数中传递。任何关于如何正确设置的帮助都将不胜感激 onEscPress(e) { if (e.which === 27) { alert('test'); this.send('dismissModal'); } }, willInsertElement() { window.addEventListener(
onEscPress(e) {
if (e.which === 27) {
alert('test');
this.send('dismissModal');
}
},
willInsertElement() {
window.addEventListener('keydown', this.onEscPress(e), false);
},
willDestroyElement() {
// Uses a different function, so doesn't properly remove the listener
window.removeEventListener('keydown', this.onEscPress(e), false);
},
重要的是要理解,在代码中,您将onEscPress的结果传递给事件处理程序。这不是你想要的 此外,如果要使用
this
,则不能直接将函数传递给事件处理程序,因为它将在不同的动态上下文中执行。所以正确的方法是
init
hook中创建函数的绑定版本didInsertElement
钩子中的绑定函数,然后元素
钩子中删除此绑定函数onEscPress(e) {
if (e.which === 27) {
alert('test');
this.send('dismissModal');
}
},
init() {
this._super(...arguments);
this.set('boundOnEscPress', this.get('onEscPress').bind(this));
},
willInsertElement() {
this._super(...arguments);
window.addEventListener('keydown', this.get('boundOnEscPress'), false);
},
willDestroyElement() {
this._super(...arguments);
window.removeEventListener('keydown', this.get('boundOnEscPress'), false);
},
也不要忘记调用
this.\u super(…参数)代码>!这真的很重要 重要的是要理解,在代码中,您将onEscPress的结果传递给事件处理程序。这不是你想要的
此外,如果要使用this
,则不能直接将函数传递给事件处理程序,因为它将在不同的动态上下文中执行。所以正确的方法是
在init
hook中创建函数的绑定版本
将事件侦听器添加到didInsertElement
钩子中的绑定函数,然后
在元素
钩子中删除此绑定函数
下面是一些代码:
onEscPress(e) {
if (e.which === 27) {
alert('test');
this.send('dismissModal');
}
},
init() {
this._super(...arguments);
this.set('boundOnEscPress', this.get('onEscPress').bind(this));
},
willInsertElement() {
this._super(...arguments);
window.addEventListener('keydown', this.get('boundOnEscPress'), false);
},
willDestroyElement() {
this._super(...arguments);
window.removeEventListener('keydown', this.get('boundOnEscPress'), false);
},
也不要忘记调用this.\u super(…参数)代码>!这真的很重要 要删除的处理程序必须与添加的处理程序完全相同。它也必须是一个函数,而不是函数调用。我相信将其修复为this.onEscPress
应该可以解决问题。我重现了这个问题。同上,您正在将未定义的传递到添加/删除事件侦听器(调用您的函数的结果)要删除的处理程序必须与添加的处理程序完全相同。它也必须是一个函数,而不是函数调用。我相信将其修复为this.onEscPress
应该可以解决问题。我重现了这个问题。同上,您正在将未定义的传递到添加/删除事件侦听器(调用您的函数的结果)