HostListener分析组合键按下

Mit*_*ran 8 typescript angular

我试图跟踪用户使用键盘按Shift + Tab组合键,但我无法触发该事件

@HostListener('keyup', ['$event'])
@HostListener('keydown', ['$event'])

onkeyup(event) {
  if (event.keyCode == 16 && event.keyCode == 9) {
    this.isShift = true;
    console.log("On Keyup " + event.keyCode);
  }
}

onkeydown(event) {
  console.log("On KeyDown" + event.keyCode);
}
Run Code Online (Sandbox Code Playgroud)

Fra*_*ica 9

它在我这样做时有效:

@Directive({
  selector: '[test-directive]'
})
export class TestDirective {
  @HostListener('keydown', ['$event']) onKeyDown(e) {
    if (e.shiftKey && e.keyCode == 9) {
      console.log('shift and tab');
    }
  }
}

<input type="text" test-directive />
Run Code Online (Sandbox Code Playgroud)

请注意,这keyup可能很棘手,因为tab可能会使元素失焦.所以到了keyup火星时,你可能会在下一个元素上,所以keyup实际上可能会触发该元素.所以这取决于你需要什么.但keydown适用于当前元素.


小智 6

尽管Frank Modica的解决方案可行,但使用Angular的键事件过滤和伪事件将是一个更具可读性和更简洁的解决方案:

@Directive({
    selector: '[keyHandler]'
})
export class KeyHandlerDirective {

    @HostListener('keydown.shift.tab', ['$event'])
    onKeyDown(e) {
        // optionally use preventDefault() if your combination
        // triggers other events (moving focus in case of Shift+Tab)
        // e.preventDefault();
        console.log('shift and tab');
    }
}

// in template:
<input type="text" keyHandler />
Run Code Online (Sandbox Code Playgroud)

有关伪事件如何工作的更多示例,请参见此处

  • Angular 的文档在这方面很糟糕,但这篇文章帮助了我:https://medium.com/claritydesignsystem/angular-pseudo-events-d4e7f89247ee (2认同)