错误元素Angular 6上的外部点击指令触发事件

时间:2019-04-30 10:35:05

标签: angular angular6 directive

我创建了一个指令,如下所示使用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所有人

1 个答案:

答案 0 :(得分:0)

确实不理想,但应该可以。您可以考虑使用id或类而不是tagName来过滤出元素。

@HostListener('document:click', ['$event'])
  clickout(event) {
    if (
      this.eRef.nativeElement.contains(event.target) === false
      && event.target.tagName !== 'SPAN'
    ) {
      this.outsideclick.emit(event);
    }
  }