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;
}
}
}
假设我想在用户每次点击 <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;
}
}
}