【发布时间】:2018-09-13 06:39:14
【问题描述】:
这是我打开弹窗的方式:
<div>
<a (click)="trigger = true">
<div>
<i class="pe-7s-file"></i>
</div>
</a>
<div popover clickOutside (clickOutside)="console.log('Outside')" *ngIf="trigger==true">
<p>Hello Popover</p>
</div>
</div>
当我点击它在控制台中打印的第一个 div 时(外部),我想在控制台上第一次打开弹出框而不显示任何消息,当我点击弹出框 div 外部时,控制台应该打印。
这是我的主持人:
@Directive({
selector: '[clickOutside]'
})
export class ClickOutsideDirective {
constructor(private _elementRef: ElementRef) { }
@Output('clickOutside') clickOutside: EventEmitter<any> = new EventEmitter();
@HostListener('document:click', ['$event.target'])
onMouseEnter(targetElement) {
const clickedInside = this._elementRef.nativeElement.contains(targetElement);
if (!clickedInside) {
this.clickOutside.emit(null);
}
}
}
【问题讨论】:
-
您能在这里解释一下您的最终目标吗?如果您的意思是像模态或工具提示这样的“弹出框”,也许您应该使用 CDK 及其
OverlayModule而不是指令。 -
(我告诉你,因为叠加层有一种非常简单的方法来监听背景中的点击事件)
-
@HostListener有效吗? -
是否会委托事件挂钩来记录并按目标过滤?或者将适用于每个文档 onclicks ?或者根本不是那个“主机”监听器,而是事件监听器
标签: angular