anc*_*nco 1 addeventlistener ember.js
我想在Ember中的keydown事件中的组件中设置事件侦听器。已正确添加了事件侦听器,但是由于removeEventListener传递了另一个函数,因此我似乎无法将其删除。任何有关如何正确设置此设置的帮助将不胜感激。
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);
},
Run Code Online (Sandbox Code Playgroud)
了解在您的代码中将onEscPress 的结果传递给事件处理程序非常重要。这不是您想要的。
另外,如果要使用this
,则不能直接将函数传递给事件处理程序,因为它将在不同的动态上下文中执行。因此,正确的方法是
init
挂钩中创建函数的绑定版本,didInsertElement
挂钩中的绑定函数,然后willDestroyElement
挂钩中删除此绑定函数。所以这是一些代码:
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);
},
Run Code Online (Sandbox Code Playgroud)
也永远不要忘记打电话this._super(...arguments);
!它真的很重要!