Ember.js 如何删除余烬中的事件侦听器

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(

我想在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);
},

重要的是要理解,在代码中,您将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
    应该可以解决问题。我重现了这个问题。同上,您正在将
    未定义的
    传递到添加/删除事件侦听器(调用您的函数的结果)