【问题标题】:Simple way to detect click outside of child component检测子组件外部点击的简单方法
【发布时间】:2026-01-15 20:05:01
【问题描述】:

我想根据变量的值扩展和收缩子 div 组件,但我希望能够单击该组件(在兄弟的父组件中)以及折叠它。

这是一个stackblitz 示例。我尝试使用在this question 中找到的HostListener,但这对我的情况没有帮助。

 @HostListener('document:click', ['$event'])
    documentClick(event: MouseEvent) {
        // your click logic
    }

目标:

  1. 当我单击子 (hello) 组件时,如果它还没有展开,我希望它展开,如果它已经展开,我希望它收缩
  2. 当我单击其他任何内容(即父组件或同级组件)时,我希望子 (hello) 组件在展开时收缩。

我不希望子 (hello) 组件在单击父/兄弟时展开。

更新:使用 HostListener

hello.component.html

<div class="box" (click)="clicked()" [ngClass]="{large: isEnlarged}">Hello.component</div>

hello.component.ts

export class HelloComponent  {
  isEnlarged = false;

  clicked() {
    this.isEnlarged = !this.isEnlarged;
  }

  @HostListener('document:click', ['$event'])
  documentClick(event: MouseEvent) {
    console.log('clicked');
    this.isEnlarged = false;
  }
}

app.component

export class AppComponent  {

}

【问题讨论】:

  • 你想通过点击父级获得hello的高度吗?
  • “我试图使用我在这个问题中找到的 HostListener,但它对我的情况没有帮助......” 怎么会这样?这正是您正在寻找的。​​span>
  • @ritaj 也许我用错了?
  • 嗯,我不知道。这是每次在组件内部或外部单击文档的侦听器。您应该发布您尝试过的内容。
  • 我会的。我会再次尝试弄清楚。

标签: javascript html angular


【解决方案1】:

问题是您的点击处理程序将 expanded 设置为 true 之前文档点击事件处理程序将其设置为 false,因此它始终为 false。

如果事件目标不是您的组件,您只能将其设置为 false:

https://stackblitz.com/edit/mouse-click-anywhere-8bwg6p?file=src/app/hello.component.ts

  @HostListener('document:click', ['$event'])
  documentClick(event: MouseEvent) {
    console.log('clicked');
    console.log(event);
    if (event.target.id !== 'box') {
      this.isEnlarged = false;
    }
  }

【讨论】:

  • 直到我意识到我没有在 HTML 方面设置任何 ID 之前,它对我不起作用!感谢您的建议:-)