angular - 错误元素Angular 6上的外部点击指令触发事件
问题描述
我创建了一个指令,用于使用 Angular6 捕获元素的外部点击,如下所示。
import { Directive, Output, HostListener, EventEmitter, ElementRef } from '@angular/core';
@Directive({
selector: '[appOutsideclick]'
})
export class OutsideclickDirective {
@Output() outsideclick = new EventEmitter();
constructor(public eRef: ElementRef) { }
@HostListener('document:click', ['$event'])
clickout(event) {
if (this.eRef.nativeElement.contains(event.target) === false) {
this.outsideclick.emit(event);
}
}
}
它运行良好,除非我们在容器内有一个隐藏的元素,*ngIf
并且如果我们在显示时单击它会触发事件。
<div appOutsideclick (outsideclick)="someFunction1()">
<span *ngIf="showMe" click="someFunction2()">This element shown after ng init based on a condition </span>
This text is alwaise shown
</div>
如果我们单击 span 元素,它会触发outsideclick
事件。如何解决这个问题?
注意:
我知道在这个例子中,它可以使用[hidden]="!showMe"
,但这只是一个便于理解问题的例子。我的 html 很复杂并且包含来自节点模块的组件,所以我不能应用hidden
everywere
解决方案
真的不理想,但应该工作。您可以考虑使用 id 或 class 而不是 tagName 来过滤掉元素。
@HostListener('document:click', ['$event'])
clickout(event) {
if (
this.eRef.nativeElement.contains(event.target) === false
&& event.target.tagName !== 'SPAN'
) {
this.outsideclick.emit(event);
}
}
推荐阅读
- android - Powermock Jacoco Gradle 0% 覆盖 Android 项目
- python - 使用时间序列的百分位数在 Python 的 matplotlib 中设置颜色渐变
- ios - Xcode Info.plist 错误:一行上的连续语句必须用';'分隔 但看起来像有效的 XML
- java - 将变量的值更改为另一个变量的值
- azure - Azure 经典虚拟网络中缺少网关
- swift - 如何在 ios 应用程序中缓存 PDFDocument - swift?
- java - @ModelAttribute 与 Spring MVC 中的抽象类
- c++ - 库函数需要一个 std::function
,我如何传入一个类函数? - asp.net-mvc - 如何计算应用程序可用性 (SLA)
- ios - 在 CGContext 中渲染两个 UILabel 而不重叠