我正在使用Angular 6。我有一个带有点击事件的表格行(<TR>
)。为了测试目的,让我们假设该事件将“quack!”打印到控制台。以下是HTML:
<tr *ngFor="let t of things" (click)="quack()">
...
</tr>
在组件中:
quack() {
console.log('quack!');
}
现在,在这一行中我有一个复选框。它是Bootstrap 4的自定义复选框,但我认为这与我需要解决的问题无关。该复选框具有一个自定义指令,该指令添加了一个change事件处理程序(而不是click事件)。HTML的简化版本如下:
<tr *ngFor="let t of things" (click)="quack()">
...
<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" id="cb{{t.id}}" name="cb{{t.id}}"
[my-directive]="b.somedata">
<label class="custom-control-label" for="cb{{t.id}}"> </label>
</div>
...
</tr>
在my-directive指令代码中:
@HostListener('change') onChange() {
// do some stuff...
}
问题
我希望在任何人点击该行时,quack()
函数都会触发,除非他们点击复选框。当他们选中或取消选择复选框时,我希望自定义指令中的onChange()
函数被触发,并且我不想要quack声。
每次单击行时,控制台上都会出现“quack!”,这是正确的。但是奇怪的是,当我单击复选框时,会出现两个 quack 声,然后onChange()
处理程序才会触发。 我想要零个quack声,我预期只会有一个,但是我得到了两个!
- 顺便说一句,当我通过按空格键而不是点击来选中/取消选中复选框时,仍然会得到一个 quack。我无法想象单击事件来自哪里。
我在 <input>
元素中添加了 (click)="$event.stopPropagation();"
,以此来解决这个问题。当我单击复选框时,这使我只得到一个 quack 。但是我希望得到零个quack声。 我该如何防止单击复选框传播触发 quack()
的click()
事件?
- 顺便说一句,在添加了该代码片段后,使用空格键切换复选框会产生零个quack声。
(click)
事件时,浏览器事件已经传播,因此您无法停止它。但是,您仍然可以通过使用纯JavaScript创建自己的点击事件来停止点击事件。 - Ploppy(click)
事件处理程序中停止传播。 - ConnorsFanclick
事件并停止其传播,它似乎可以工作。注意:在我的代码示例中,我确保每个复选框的id
和name
是唯一的(但即使没有这种更改,单击管理也可以正常工作)。 - ConnorsFan(click)
事件处理程序中停止了事件传播。 - ConnorsFan