javascript - Advanced Angular @HostListener - 记录父组件中所有元素的点击(来自子组件)
问题描述
我想将子组件的逻辑保留在其中。但是,事件本身是从其父组件向下发生单击时。
child.component.ts
@HostListener('document:click', ['$event']) onClick(event: MouseEvent) {
// get the parent component tag
const parentComponent = this.eRef.nativeElement.parentNode.parentNode;
for (let i = 0, j = parentComponent.length; i < j; i++) {
if (event.target == parentComponent[i]) {
console.log(parentComponent[i]);
}
}
我已经尝试了很多方法来遍历节点列表并比较 click event.target 以查看点击是在内部parent
还是外部,但我似乎无法迭代 nodeList 并且不明白为什么。
我在repro StackBlitz上也尝试了许多其他的东西。
也许有更好的方法来观察该组件父级外部/内部的点击?另外,我不想将点击逻辑移动到父级,除非必须,否则逻辑不属于那里。
已修复:StackBlitz 已经更新了我所有关于使用 elementRef 遍历 DOM 的研究。@Ritchie 也正确地循环了 nodeList 并让它以这种方式工作。
解决方案
您可以使用 的target
属性MouseEvent
来检查单击了哪个组件并将其与父节点名称进行比较。
@HostListener('document:click', ['$event.target']) onClick(event) {
const parentEl = this.eRef.nativeElement.parentNode.tagName;
const path = [];
let currentElem = event;
while (currentElem) {
path.push(currentElem.tagName);
currentElem = currentElem.parentElement;
}
console.log('Clicked inside parent: ', path.includes(parentEl));
}
推荐阅读
- ruby-on-rails - 在运行时,如何获取文件的路径以及特定对象/类从哪个 gem 加载到 ruby 中?
- python - Python Eclipse PyDev
- r - 用结果在 r 中分割文件 ANOVA
- ios - 带有大标题的 UISearchController 在选项卡栏中崩溃,“只有一个带有顶部边界的调色板可以在过渡之外处于活动状态”
- reactjs - UI 状态与 Redux 状态
- node.js - nodejs中的车把助手不起作用
- ios - Appcelerator 钛图像在列表视图中的 IOS 中向下或向上滚动时消失
- c# - 使用 TraceSource 跟踪和记录到文件
- r - 使用 R 分析的 Django Web 应用程序
- ruby - Rubocop atom linter 不起作用