【发布时间】:2018-03-21 20:11:42
【问题描述】:
我正在创建一个 Angular 组件,该组件包装原生 <button> 元素和一些附加功能。如果按钮被禁用并且我想复制相同的功能,则按钮不会触发单击事件。即,给定:
<my-button (click)="onClick()" [isDisabled]="true">Save</my-button>
my-button 有没有办法防止onClick() 被调用?
在Angular中你可以通过这种方式监听宿主点击事件,并停止事件的传播:
//Inside my-button component
@HostListener('click', ['$event'])
onHostClick(event: MouseEvent) {
event.stopPropagation();
}
这可以防止事件冒泡到祖先元素,但不会阻止内置 (click) 输出在同一宿主元素上触发。
有没有办法做到这一点?
编辑 1:我现在解决此问题的方法是使用名为“onClick”的不同输出,消费者必须知道使用“onClick”而不是“click”。这并不理想。
编辑 2: 源自 <button> 元素的点击事件已成功停止。但是,如果您像我一样将元素放在按钮标签内,那么这些目标上的单击事件会传播到主机。嗯,应该可以将按钮包装在另一个停止传播的元素中......
【问题讨论】:
-
(click)="condition ? onClick() : null"
-
我希望它表现得像一个按钮——我不希望我的组件的使用者必须首先检查禁用状态。
-
this stackblitz 做你想做的事吗?
-
关闭:我认为this stackblitz edit 对我来说会更简单一些。没错,如果禁用,我们希望停止传播主机内的所有内容。如果
<button>被禁用,您将无法收听(并停止)源自按钮内跨度的点击传播。但是您可以从包装按钮但在主机内部的另一个元素执行此操作 - 只要主机的某些部分没有您可以单击包装元素之外的部分。
标签: javascript angular angular-template