Angular。仅绑定事件一次(在第一次初始化时)

Angular. Bind event only one time (on first init)

假设我想在用户每次点击 <a> 标签时提醒他。

document.querySelector('body').addEventListener('click', function (event : any) {
            if (event.target.tagName === 'A') {
                event.preventDefault();
                alert('Congratulations! A tag clicked!!!');
            }
        });

如果我将此绑定放在 constructor 中(在 ngOnInit() 中打开),我每次访问此组件(路由器 link 时都会有新的绑定(和一个警报) ).
在第一次初始化时只绑定一次的方法是什么?

同时我在 ngOnDestroy() 中使用 removeEventListener()。好像很难看。还有更好的吗?

您似乎需要检查您的元素上是否已存在所需的事件侦听器。请参考:How to check whether dynamically attached event listener exists or not?

基于 this answer 我建议使用这样的东西(至少对我有用):

function showAlert(evt) {
  evt.preventDefault();
  alert('Congratulations! A tag clicked!!');
}

  const aTags = document.querySelectorAll('a');
  for (const i in aTags) {
    const element = aTags[i];
      if (element instanceof Element && element.getAttribute('listener') !== 'true') {
        element.addEventListener('click', showAlert);
        element.setAttribute('listener', 'true');
    }
  }

如果您需要像示例中那样将事件侦听器绑定到整个主体,则可以使用静态变量。只需在组件的开头创建一个并在绑定事件侦听器之前检查它的值。例如:

export class CongratulationsComponent implements OnInit {
  static flag = true;
  constructor() {}

  ngOnInit() {
    if (CongratulationsComponent.flag) {
      document.querySelector('body').addEventListener('click', function (event: any) {
        if (event.target.tagName === 'A') {
          event.preventDefault();
          alert('Congratulations! A tag clicked!!!');
        }
      });
      CongratulationsComponent.flag = false;
    }
  }
}