gpt4 book ai didi

angular - 在 Angular 2 中使用影子 DOM 时,Node.contains() 是否有效?

转载 作者:太空狗 更新时间:2023-10-29 17:45:11 25 4
gpt4 key购买 nike

我在文档中的任何地方都找不到这个,但是当我单击属于父组件的组件内的某些内容时,我的 Node.contains() 函数不起作用。

我的父组件是这样的:

<div class="body">
<div class="item" *ngFor="let item of sortedItems;">
<cv-checkbox></cv-checkbox>
<cv-svg-icon></cv-svg-icon>
</div>

<div class="drop-zones" *ngFor="let zone of sortedItems.length + 1 | numberToArrayPipe;>
<div class="drop-zone"></div>
</div>
</div>

如您所见,我的父组件中有两个 Angular 组件:cv-checkboxcv-svg-icon。我已经向我的父组件添加了一个指令,如下所示:

<cv-layer-manager cvClickOutside (clickOutside)="toggleLayerManager()"></cv-layer-manager>

我在哪里检查点击的节点是否包含在父节点中,如下所示:

@HostListener('document:click', ['$event']) public onClick(event: MouseEvent) {
const clickedInside = this._elementRef.nativeElement.contains(event.target);
if (!clickedInside) {
this.clickOutside.emit();
}
}

如果我单击普通的 HTML 组件,一切都会按预期工作,但当我单击 Angular 组件时却没有。 contains 不检查 Angular 组件内部是否正确?

最佳答案

我在日期选择器上遇到了类似的问题。为了解决这个问题,我向当前组件添加了 allowClose 属性。

@ViewChild('element') elementRef: ElementRef;
private allowClose = true;

然后我添加了另一个 HostListener,它只监听当前组件的事件。

@HostListener('click', ['$event'])
clickInside(event: any) {
this.allowClose = false;
}

然后我修改了我的 clickOutside 方法以仅在 allowClose 为真时处理关闭,然后再次将 allowClose 设置回真。

@HostListener('document:click', ['$event'])
clickOutside(event: any) {
if (!this.elementRef.nativeElement.contains(event.target) && this.allowClose) {
this.handleClose();
}
this.allowClose = true;
}

就是这样!

关于angular - 在 Angular 2 中使用影子 DOM 时,Node.contains() 是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47977020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com