如何在 Ember js 3.13 中正确处理按键事件

How to handle keypress event properly in Ember js 3.13

我是 Ember 的新手,我想捕捉全局按键事件并在我的组件中处理它。

经过大量网络爬取后,我使用全局 window.onkeydown = this.handleKeyPress 以老式方式完成了它,并且在 handleKeyPress 函数中我做了一些代码并调用了 this.movePlayerInDirection 但现在我的 'this' 是window.

onKeyPress(e, comp) {
    let keyCode = e.keyCode;`

    if (keyCode === KEY_LEFT ||
        keyCode === KEY_UP ||
        keyCode === KEY_RIGHT ||
        keyCode === KEY_DOWN) {
        let direction;

        switch(e.keyCode) {
            case KEY_LEFT:
                direction = {x: -1, y: 0}
                break;
            case KEY_RIGHT:
                direction = {x: 1, y: 0}
                break;
            case KEY_UP:
                direction = {x: 0, y: -1}
                break;
            case KEY_DOWN:
                direction = {x: 0, y: 1}
                break;
        }
        this.movePlayerInDirection(direction);
    }
}
  1. 这是赶上这个活动的最佳方式吗? (ember 方式)

  2. 如何从 window 范围访问组件功能?

更新:

根据下面的答案,我刚刚添加了 window.onkeydown = this.onKeyPress.bind(this) 并且有效

没有特殊的ember方法可以做到这一点。但是有像 ember-keyboard-shortcuts.

这样的插件

但是通常使用 window.addEventListener 并不是一个坏主意。但是你需要做两件事:

  1. 当组件被销毁时清理监听器
  2. 将事件绑定到函数上下文

对于经典组件,它可能如下所示:

Component.extend({
  init() {
    this.boundOnKeyPress = this.onKeyPress.bind(this);
  },
  didInsertElement() {
    window.addEventListener('keypress', this.boundOnKeyPress);
  },
  willDestroy() {
    window.removeEventListener('keypress', this.boundOnKeyPress);
  },
  onKeyPress() {
    ...
  }
})

我更喜欢使用 ember-keyboard 插件来完成这项工作。这对它在下面 link 中提供的功能有很好的解释, https://github.com/briarsweetbriar/ember-keyboard

首先你需要将 mixin 添加到你的组件中,

import Ember from 'ember';
import { EKMixin } from 'ember-keyboard';

export default Ember.Component.extend(EKMixin, {
  . . . .
});

然后需要设置keyboardActivated 属性为真。以下代码将在 init 方法之后调用。

activateKeyboard: Ember.on('init', function() {
    this.set('keyboardActivated', true);
  })

您应导入所需的事件

import { keyPress } from 'ember-keyboard';

onKeyPressHandler: Ember.on(keyPress('Escape'), function() {
        // console.log('escape button pressed');        
    }),

在您的情况下,如果您希望每次按键都触发一个事件,那么只需不要向 keyUp 或 keyDown 提供键串即可。这可能是触发大范围按键事件的便捷方式,例如在任何字母数字按键上。例如:

import { getCode } from 'ember-keyboard';

triggerOnAlphaNumeric: Ember.on(keyUp(), function(event) {
  if (/^Key\w(?!.)/.test(getCode(event))) {
    ...
  }
})

我们编写 ember-key-manager 是因为它提供了比任何其他按键事件插件更简洁的界面。具体来说,它提供了一项服务,因此您可以将它注入到任何地方,而不会卡在使用 mixins(现在已弃用)。