角封装和外部点击指令

时间:2018-09-18 22:11:35

标签: angular angular5 angular6 encapsulation

问题::如果用户在侧边栏之外单击,我需要添加一种方法来绑定并关闭侧边栏菜单。

我已经创建了一条指令(某事like found on this),该指令检查click是否绑定在元素之外,但是当用户完全单击侧边栏上我的字体真棒图标时,就被认为是外部单击,菜单不是打开(该指令有效,我点击了按钮填充检查了它)...

我想这是我的指令中的一个问题,它是由角度封装引起的...

我的代码:

<aside [ngClass]="{'open': menuStatus}" (clickOutside)="menuStatus = false">
    <button (click)="menuStatusToggle()">
        <fa-icon [icon]="['fas', 'bars']" *ngIf="!menuStatus"></fa-icon>
        <fa-icon [icon]="['fas', 'times']" *ngIf="menuStatus"></fa-icon>
    </button>
    (Menu Content...)
</aside>

绑定事件:

@HostListener('document:click', ['$event.target'])
  public onClick(targetElement) {

    // Variable content always false when click on icon of _elementRef
    const clickedInside = this._elementRef.nativeElement.contains(targetElement);

    if (!clickedInside) {
      this.clickOutside.emit(null);
    }
  }

有人有建议吗?封装真的有问题吗?

2 个答案:

答案 0 :(得分:1)

要确保字体真棒图标不会捕获click事件,请在组件CSS中定义以下样式:

$(document).ready(function(){$(body).addClass('js')})

使用该样式属性,按钮会收到click事件,然后可以对其进行正确处理。

有关演示,请参见this stackblitz


另一种解决方案是处理主机元素上的click事件,并停止传播。结果,到达文档的所有单击事件都在宿主元素之外:

fa-icon {
  pointer-events: none;
}

有关演示,请参见this stackblitz

答案 1 :(得分:0)

您需要对onClick函数上的参数进行更正,应该像这样:

@HostListener('document:click', ['$event.target'])
public onClick(event) {

  const clickedInside = this._elementRef.nativeElement.contains(event.target);

  if (!clickedInside) {
    this.clickOutside.emit(null);
  }
}