Angular2 - catch/subscribe 到动态添加的(单击)事件 HTML

Angular2 - catch/subscribe to (click) event in dynamically added HTML

我正在尝试将包含 (click) 事件的字符串注入到 Angular2 模板中。在加载 DOM 之后,从后端动态检索该字符串。 Angular 无法识别注入的 (click) 事件也就不足为奇了。

示例模板:

<div [innerHTML]="test"></div>

后端给出的示例字符串:

var test = "When ready, <span (click)=\"itemClick($event)\">click me</span>."

Angular 组件中的示例函数调用:

itemClick(event) {
   debugger;
}


我的下一个猜测是尝试让 Angular 订阅或捕获一个普通的 javascript 事件,因此字符串将是:

var test = "When ready, <span onClick=\"itemClick($event)\">click me</span>."

果然,我得到一个 itemClick is not defined 的错误,所以我知道它正在寻找 javascript 函数。

所以问题:如何让Angular2订阅这个事件或功能?

仅在组件模板的静态 HTML 中支持声明性事件绑定。
如果要订阅动态添加的元素的事件,需要命令式。

elementRef.nativeElement.querySelector(...).addEventListener(...)

或类似。

如果你想要 WebWorker 安全,你可以注入 Renderer

constructor(private elementRef:ElementRef, private renderer:Renderer) {}

并改用

this.renderer.listen(this.elementRef.nativeElement, 'click', (event) => { handleClick(event);});

注册事件处理程序。

另见

我在 service 中导入 ElementRef 时遇到问题,不想在那里传递 Renderer 引用。此服务是关于显示 'Loading...' 对话框,其中 3 秒后 动态关闭按钮 被附加。我找到了如何使用 jQuery 为此按钮添加点击事件的解决方案。希望这对某人有所帮助。

(1) 添加 jQuery 到 Angular 2 index.html 文件

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

(2) 声明 $

declare var $: any;

(3) 使用jQuery 这是我服务中的一段代码:

 public async present() {
    this.isLoading = true;
    return await this.loadingController.create({message: 'Loading...'}).then(a => {
      a.present().then(() => {
        setTimeout(() => {
          a.message += '<ion-icon name="close-circle" class="alert-cancel-button"></ion-icon>';


          // Here starts jQuery usage
          $(a).click((clickedObject) => {
            if ($(clickedObject.target).hasClass('alert-cancel-button')) {
              this.dismiss();
            }
          });


        }, 3000);
      });
    });
  }

  public async dismiss() {
    return await this.loadingController.dismiss();
  }
  • 顺便说一句 $('alert-cancel-button').click(() => this.dismiss()) 没用。