angular - 由于事件冒泡顺序,不能`stopPropagation()`?
问题描述
tr
我已经在其中注册了事件处理程序input
- 下面的代码。单击行可以正常工作,但单击复选框rowClick()
之前 onChange()
会调用,所以我认为stopPropagation()
并且preventDefault()
不能做我期望的事情。如何解决这个问题?我正在使用 Angular6。
onChange($event:any) {
$event.preventDefault();
$event.stopPropagation();
}
<tr (click)="rowClick()">
<td><input type="checkbox" (change)="onChange($event)"/></td>
</tr>
在这里编辑 Plunker
解决方案
基本上你试图阻止change
你的输入事件,但事情是click
事件正在冒泡到父tr
元素。这就是为什么你应该停止那个click
事件td
。
更好的方法是将这种 DOM 行为封装在指令中,并在需要时以声明方式使用它。
指示
import {
Directive, HostListener
} from "@angular/core";
@Directive({
selector: "[stop-click-propagation]"
})
export class StopClickPropagation
{
@HostListener("click", ["$event"])
public onClick(event: any): void
{
event.stopPropagation();
}
}
html
<tr (click)="rowClick()">
<td>
<input stop-click-propagation type="checkbox" (change)="onChange($event)"/>
</td>
</tr>
注意:确保您
StopClickPropagation
在内部注册NgModule
以使其正常工作。
推荐阅读
- html - 说明框未正确呈现
- visual-studio-2019 - 升级到 Visual Studio 16.8.5 浏览器后不显示对网页的更改
- redux - Action Thunk 未触发 createAsyncThunk 内的 fetch API 调用
- sql-server - 如何计算表在 SQL 中满足条件的每小时时间量
- powerbi - 按唯一日期获取平均记录数
- python - AttributeError:模块“lacosmicx”没有属性“lacosmicx”
- dart - 为什么 assert 语句没有按预期运行?
- selenium - Selenium 从网格中获取行
- sqlplus - 我正在尝试从 oracle sqlplus 获取一些值,我想要介于 550000 和 56000 之间的值
- java - 使用 RestTemplate 设置获取 erquest 的标头