在Angular中停止鼠标事件传播的最简单方法是什么?
我应该传递特殊的$event对象和调用stopPropagation()自己或有一些其他的方式。
例如,在Meteor中,我可以简单地从事件处理程序返回false。
在Angular中停止鼠标事件传播的最简单方法是什么?
我应该传递特殊的$event对象和调用stopPropagation()自己或有一些其他的方式。
例如,在Meteor中,我可以简单地从事件处理程序返回false。
当前回答
提供的大多数解决方案都适用于Angular 11以上的版本,对于Angular 11或以下版本,我找到了一个可以使用的变通方案:
export class UiButtonComponent implements OnInit, OnDestroy {
@Input() disabled = false;
clickEmitter: Subject<any> = new Subject();
constructor(private elementRef: ElementRef) { }
ngOnInit(): void {
this.elementRef.nativeElement.eventListeners()
.map(listener => this.clickEmitter.pipe(filter(event => Boolean(event))).subscribe(event => listener(event)));
this.elementRef.nativeElement.removeAllListeners();
this.elementRef.nativeElement.addEventListener('click', (event) => {
if (!this.disabled) {
this.clickEmitter.next(event);
}
});
}
ngOnDestroy(): void {
this.clickEmitter.complete();
}
}
我基本上把当前组件的每个侦听器都放在Observable上,然后,我只注册一个侦听器,并在那里管理操作。
上面的例子是在给定一个布尔变量的情况下禁用按钮上的click事件。
其他回答
这解决了我的问题,从防止一个事件被一个孩子触发:
doSmth () { // what ever } < div(点击)= " doSmth ()" > < div(点击)= " $ event.stopPropagation ()" > <组件> < /组件> < / div > < / div >
如果你在一个绑定到事件的方法中,简单地返回false:
@Component({
(...)
template: `
<a href="/test.html" (click)="doSomething()">Test</a>
`
})
export class MyComp {
doSomething() {
(...)
return false;
}
}
在事件上调用stopPropagation来阻止传播:
(event)="doSomething($event); $event.stopPropagation()"
对于preventDefault只返回false
(event)="doSomething($event); false"
事件绑定允许执行按顺序执行的多条语句和表达式(由;比如*。ts文件。 如果是false,最后一个表达式的结果将导致preventDefault被调用。所以要小心表达式返回的内容(即使只有一个)
最简单的方法是在事件处理程序上调用停止传播。$event在Angular 2中的工作原理是一样的,它包含了正在发生的事件(鼠标点击、鼠标事件等等):
(click)="onEvent($event)"
在事件处理程序中,我们可以停止传播:
onEvent(event) {
event.stopPropagation();
}
在函数后添加false将停止事件传播
<a (click)="foo(); false">click with stop propagation</a>