【问题标题】:Angular 2 Host Event Listener bubblingAngular 2主机事件监听器冒泡
【发布时间】:2018-03-27 05:31:00
【问题描述】:

我已经构建了一个指令,它使用主机事件侦听器订阅键盘事件。当按下转义键时,我正在触发这样的输出事件

    @HostListener('document:keyup', ['$event'])
    handleKeyboardEvent(kbdEvent: KeyboardEvent) {
       if (kbdEvent.keyCode === 27) {
            this.CloseEvent.emit();
       }
    }

我对子元素有这个指令。当按下转义键时,我只想为新订阅的元素触发输出事件。问题是当我单击转义键时,事件会根据层次顺序触发。我这里做了一个demo:https://plnkr.co/edit/FfnHAtxl2zcHsu0JilKt

重现步骤:

  1. 添加多个子元素
  2. 点击Escape它会关闭所有元素

预期行为:

  1. 当在最后添加的子元素上点击Escape时,需要触发事件

【问题讨论】:

  • 因为你正在这样做'document:keyup' 指令的每个实例都会为 keyup 添加一个全局事件监听器,所以无论你在哪里按下一个键,它都会在指令的所有实例上发出。在此处查看控制台plnkr.co/edit/9paiFapxVf2yaB6uPAnc?p=preview
  • 你是对的。有什么方法可以先触发最近添加的订阅实例并停止事件传播,以避免其他实例停止触发?

标签: angular


【解决方案1】:

您应该正在监听渲染元素的keyup 事件。

@HostListener('keyup') onKeyup() {
     this.defaultColor.emit('');
 }

LIVE DEMO

【讨论】:

    【解决方案2】:

    您正在将事件侦听器附加到 document:keyup

    Document 接口代表浏览器中加载的任何网页。

    尝试@HostListener('keyup', ['$event']) 订阅承载属性指令的DOM 元素的keyup 事件。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 2016-06-25
    • 2018-04-15
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    相关资源
    最近更新 更多