多次触发 Angular @HostListener 事件

标签 angular events ionic3

我正在构建一个 Ionic 3 应用程序,我在其中创建了一个“自动完成”指令,这是一个简单的指令 当元素获得焦点时弹出一个自动完成对话框。这是通过“自动完成”完成的:

@HostListener('ionFocus', ['$event._native.nativeElement'])
  onFocus(target) {
      target.blur();
      this.showAutocompleteDialog(target);
  }

当我只在系统中只使用过一次的页面中使用该指令时,这就奏效了。

但后来我制作了一个新组件,我们称它为“AddressField”,它在其模板的一个元素中有一个“自动完成”指令。 现在 @HostListener onFocus 事件被触发了两次,因此显示了两个自动完成对话框。

这只发生在 AddressField 组件中的“自动完成”指令,并且它只在第二个实例中触发两次 系统中的“AddressField”。

我是不是以某种方式错误地使用了@HostListener,或者这听起来像是一个应该提交的错误?在任何一种情况下,某种解决方法都会 真的很有帮助。

谢谢

最佳答案

只是对此的更新:

最后,我的印象是这归结为 Angular 错误(参见 fx https://github.com/ionic-team/ionic-v3/issues/86 )——至少,我没有发现我的方法有任何问题。

我的解决方案很老套:我在我的指令中添加了一个标志“alreadyFired”,并在我的 HostListener 函数中检查它。

@HostListener('ionFocus', ['$event._native.nativeElement'])
  onFocus(target) {
    if (this.alreadyFired) {
      return;
    }
    this.alreadyFired = true;
    target.blur();
    this.showAutocompleteDialog(target);
}

当然,当关闭对话框时,我再次将 alreadyFired 标志设置为 false。 Hacky,但在截止日期前工作..

关于多次触发 Angular @HostListener 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53082060/

相关文章:

typescript - 实现 tabmenu 后 Angularfire 身份验证注销方法不起作用

google-analytics - 与 angular 1 不同,angular2 路由可以被 Google 机器人索引吗?

javascript - 如何从组件循环向主要父级发出事件 angular 5

angular - 特定实体的大量 Action /效果

c# - 如何在运行时发出事件

javascript - Angular 4 *ngFor,ngx-pipes 获取顶级键的名称

angular - 网页包/Angular 2 : specify order of styles

c# - 在事件聚合器中将枚举与事件类混合

android - 在 Android 中,当我通过 Activity 中的代码设置值时,如何停止 TextChange 事件?

angular - 在 ionic 3 中使用 firebase 使用电话号码进行身份验证