通过向元素动态添加 'Click' 事件打开 MatDialog

Open MatDialog via dynamically added 'Click' event to an element

我有一个 HTML 列表,我在其中动态设置了 .active class。具有此 class 的元素需要具有打开 MatDialog 的 'Click' 事件。问题是我在尝试执行类似操作时遇到错误:

Angular 组件 .html 文件

<ul>
  <li><span id="asd">asd</span></li>
</ul>

Angular 组件.ts 文件

constructor(private el: ElementRef) {}
...
...
this.el.nativeElement.querySelector('#asd').addEventListener('click', this.selectTimeslot);
...
...
selectTimeslot() {
  let asd2: MatDialogRef<CalendarDialogComponent, any> = this.asd.open(CalendarDialogComponent, { disableClose: true });

  asd2.afterClosed().subscribe(result => {
    console.log(`Dialog result: ${result}`);
  });
}

然后,当我单击列表中的某个元素时出现错误:

TypeError: Cannot read property 'open' of undefined

当我在 HTML 中静态声明(单击)指令时一切正常:

<ul>
  <li><span (click)="selectTimeslot()">asd</span></li>
</ul>

如何在span元素上动态添加点击事件,并能够在Angular9中打开MatDialog组件?提前致谢。

我自己找到了解决办法。这是一个经典的“this 上下文”问题。

let self = this;
..
..
this.el.nativeElement.querySelector('#asd').addEventListener('click', function() { self.selectTimeslot(this););

在函数的开头,我创建了一个新变量,它指向 Angular 组件的上下文。然后作为参数,我传递了“点击事件”的上下文。