将keyDown()注册到angular2中的特定组件

将keyDown()注册到angular2中的特定组件,angular,angular2-template,Angular,Angular2 Template,我正在尝试构建一个包含多个组件的angular2应用程序。它是使用自定义和许多第三方UI组件构建的。我使用的一个树组件使用@Hostlistener在文档上注册一个全局键控侦听器。我的一个组件有一个具有多个选择的表。因此,使用“ctrl”键的简单选择操作将触发树组件的处理程序 我的示例用例 我有一个MyTreeComponent,它有一棵树。树需要处理“delete”键并删除节点 MyTreeComponent有4-5个实例(想象一个里面有多棵树的手风琴) 我在我的组件中的keydown上注册了

我正在尝试构建一个包含多个组件的angular2应用程序。它是使用自定义和许多第三方UI组件构建的。我使用的一个树组件使用@Hostlistener在文档上注册一个全局键控侦听器。我的一个组件有一个具有多个选择的表。因此,使用“ctrl”键的简单选择操作将触发树组件的处理程序

我的示例用例

  • 我有一个MyTreeComponent,它有一棵树。树需要处理“delete”键并删除节点
  • MyTreeComponent有4-5个实例(想象一个里面有多棵树的手风琴)
  • 我在我的组件中的keydown上注册了一个侦听器,该组件的树如下所示:

    import {HostListener, KeyboardEvent} from '@angular/core';
    
    @Component({...})
    export class MyTreeComponent  {
    
      @HostListener('document:keydown', ['$event'])
      onKeyDown(event:KeyboardEvent) {
      // check if the event is a delete and perform delete action
      }
    }
    
  • 我有另一个组件和一个表,它具有行多选功能 因此,如果我在我的tablecomponent中使用ctrl键进行多重选择,那么所有4-5 MyTreeComponent instancea的“onKeyUp()”都会被激发,而且次数太多

    这大大降低了性能。有什么想法可以改进吗

    还有几个问题

  • 有没有办法注册特定于组件的Hostlistener
  • 有没有办法知道在任何时间点哪个组件当前处于活动状态(或处于焦点状态)?这样我就可以动态地添加和删除@Hostlistner(如果可能的话)

  • 提前感谢您的帮助

    请在问题中添加代码,以演示您试图完成的任务。散文很好,但很模糊<默认情况下,code>@HostListener()是特定于组件的。你认为什么是“积极的”?您可以设置
    tabindex=“0”
    并收听
    focus
    事件,跟踪您自己最后获得焦点的组件,或者使用
    activeElement
    2。您可以像javascript
    document.activeement
    一样获取。它将显示当前处于活动状态的元素。是的,正如Gunter
    tabIndex=0
    所提到的,应该在这里感谢@GünterZöchbauer和词典的输入。我更新了我的问题,补充了一些细节。有什么建议吗?什么是特定于组件的
    @HostListener()
    ?无法动态添加/删除
    @HostListener()
    。不过,您可以根据标志决定忽略处理程序内的事件<代码>如果(!ignore){doSomething}通过特定于组件的侦听器,我指的是键盘侦听器,如果按键事件发生在该组件内部而不是外部,则会触发该侦听器。即使我使用了一个标志,我也花了相当长的时间在多个实例中对太多的“ctrl”键事件进行比较。散文很好,但很模糊<默认情况下,code>@HostListener()是特定于组件的。你认为什么是“积极的”?您可以设置
    tabindex=“0”
    并收听
    focus
    事件,跟踪您自己最后获得焦点的组件,或者使用
    activeElement
    2。您可以像javascript
    document.activeement
    一样获取。它将显示当前处于活动状态的元素。是的,正如Gunter
    tabIndex=0
    所提到的,应该在这里感谢@GünterZöchbauer和词典的输入。我更新了我的问题,补充了一些细节。有什么建议吗?什么是特定于组件的
    @HostListener()
    ?无法动态添加/删除
    @HostListener()
    。不过,您可以根据标志决定忽略处理程序内的事件<代码>如果(!ignore){doSomething}通过特定于组件的侦听器,我指的是键盘侦听器,如果按键事件发生在该组件内部而不是外部,则会触发该侦听器。即使我使用了一个标志,我也经历了在多个实例中对太多的“ctrl”键事件进行比较所花费的大量时间。