我试图阻止禁用按钮上的单击事件,换句话说,防止一些删除禁用属性的用户调用某些操作。
现在,我有下面的代码来做这件事:
<button [disabled]="someCondition" (click)="executeAction()">Execute action</button>
executeAction(): void {
if (this.someCondition) return;
// ...
}
工作,但它不是一个好的解决方案,因为我必须为我的应用程序中的所有按钮做这件事(相信我,很容易忘记这样做,甚至 Linter 不能帮助我在这里)。
在寻找更强大的解决方案时,我认为directive
可以帮助我:
import { Directive, HostListener, Input, Renderer2, ElementRef } from '@angular/core';
@Directive({
selector: 'button'
})
export class ButtonDirective {
@Input() set disabled(value: boolean) {
this._disabled = value != null;
this.renderer2.setAttribute(this.elementRef.nativeElement, 'disabled', `${this._disabled}`);
}
private _disabled: boolean;
constructor(
private readonly elementRef: ElementRef,
private readonly renderer2: Renderer2
) { }
@HostListener('click', ['$event'])
onClick(mouseEvent: MouseEvent) {
// nothing here does what I'm expecting
if (this._disabled) {
mouseEvent.preventDefault();
mouseEvent.stopImmediatePropagation();
mouseEvent.stopPropagation();
return false; // just for test
}
}
}
<button [disabled]="someCondition" (click)="executeAction()">Execute action</button>
executeAction(): void {
console.log('still being called');
}
……但是它什么也没做。它不会阻止click
事件。有没有什么解决方案,我不必在调用中控制动作本身?
STACKBLITZ
4条答案
按热度按时间dauxcl2d1#
这是一个CSS的解决方案,比脚本便宜。
你可以很容易地使用
在这种情况下,按钮将不可单击。
作为一个用户体验的增强,你也可以把你的按钮 Package 在一个 div 中,并给予这个div一个CSS属性
这将显示被阻止的圆形图标,而不是正常的鼠标视图时,悬停。
wz1wpwve2#
在你的指令中,你可以这样做。您可以通过在捕获阶段向parent添加事件侦听器来实现它。
您可以删除
onDestroy
中的侦听器3ks5zfa03#
在我们的项目中,以下操作可以防止禁用按钮的单击事件,而无需定义您自己的自定义事件:
组件模板:
适用于使用:
km0tfn4u4#
防止禁用按钮上的单击事件
如果有
disabled
属性,则不会发生单击。当用户决定使用devtools时
但是,如果用户编辑HTML并手动删除禁用的属性,则单击将发生。您可以尝试按照您的建议进行检查,但浏览器是不安全的环境。用户仍然可以在网页上执行任何代码,而不管您可能会输入的任何 frontend 检查。