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

Posted

技术标签:

【中文标题】角。仅绑定一次事件(在第一次初始化时)【英文标题】:Angular. Bind event only one time (on first init) 【发布时间】:2018-06-06 22:02:31 【问题描述】:

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

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

如果我将此绑定放入constructor(在ngOnInit() 中打开),每次我访问此组件(路由器链接)时,我都会有新的绑定(以及更多警报)。 在第一次初始化时只绑定一次的方法是什么?

与此同时,我在ngOnDestroy() 中使用removeEventListener()。好像很丑。有没有更好的?

【问题讨论】:

【参考方案1】:

您似乎需要检查您的元素上是否已经存在所需的事件侦听器。请参考: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;
    
  

【讨论】:

以上是关于角。仅绑定一次事件(在第一次初始化时)的主要内容,如果未能解决你的问题,请参考以下文章

WPF,`Loaded` 事件仅在第一次视图模型初始化时触发,但不会在后续视图模型初始化时触发

如何使用在 Nextjs 上的窗口加载事件上返回本地存储值的函数初始化状态? [复制]

web监听器开发过程

JS CKEditor使用setData后绑定click事件

初始化显示事件接收器失败

C# 事件