【问题标题】:How to hide a div by clicking outside it?如何通过单击外部来隐藏 div?
【发布时间】:2019-05-14 17:22:46
【问题描述】:

我知道 jQuery 上有很多这样的解决方案。但到目前为止,我无法在 Angular 的帮助下为自己调整这些解决方案。我有一个 isOpenSharedLinkDiv 变量,它使用 * ngIf 来显示或隐藏一个 div。当我单击此 div 外部时,我尝试将此值转换为 false,但在这种情况下,div 根本没有打开。我想我错过了什么。

test() {
    console.log(this.isOpenSharedLinkDiv);
    // const div = document.querySelector('#sharing-basket-div');
    const div = document.querySelector('.page');
    // const icon = document.querySelector('#sharing-basket-icon');
    const shareDiv = document.querySelector('#share');

    div.addEventListener('click', ev => {
      if (ev.target !== shareDiv || ev.target === div && this.isOpenSharedLinkDiv === true) {
        // this.isOpenSharedLinkDiv = false;
        console.log(ev.target);
        console.log(this.isOpenSharedLinkDiv);
      } else {
        return;
      }
    });
  }

结果,这个变量被证明是假的,即使它还没有打开。

【问题讨论】:

  • 您的预期结果是什么?您使用 *ngIf 隐藏 div 但何时显示?采取什么行动?
  • 你能显示更多代码吗?从这里很难判断发生了什么。
  • 不确定它是否真的需要指令,如果您可以在此处发布您的 html 代码,这将有助于找到更好的解决方案

标签: javascript angular typescript


【解决方案1】:

你可以使用一个非常简单的指令来做到这一点:

import { Directive, ElementRef, HostListener, Input, Output, EventEmitter } from '@angular/core';

@Directive({
  selector: '[clickOutside]'
})
export class UnoClickOutsideDirective {
  constructor(private elementRef: ElementRef) {}

  @Output() clickOutside: EventEmitter<null> = new EventEmitter<null>();

  @HostListener('document:click', ['$event.target']) onMouseEnter(targetElement) {
    const clickedInside = this.elementRef.nativeElement.contains(targetElement);
    if (!clickedInside) {
      this.clickOutside.emit(null);
    }
  }
}

此指令适用于任何元素,当您在其外部单击时会告诉您。所以你可以将它与这样的 div 一起使用:

component.html

<div *ngIf="condition" (clickOutside)="condition=false"></div>

component.ts

condition: boolean = true;

【讨论】:

  • 改进方法是为 condition 使用 2 路绑定,这样您就不必使用输出,但无论如何都要 +1
  • @trichetriche 我喜欢你的想法:),我会改变答案来实现这两者......但在这种特殊情况下,我看不到使用 2 方式的真正改进绑定...好吧,我不必在组件模板中设置condition 属性,但我必须在指令中添加一个输入。无论如何,这是最佳做法吗?可以请教一下吗?
  • 老实说,我不知道这是好是坏。我个人会说好,因为它减少了使用指令时必须编写的代码量(而不是制作它)。它只是一个structural directive,使用*myDirective 语法:因为它写得像*ngIf,所以在我看来它让事情变得更容易!
  • 你是对的。 “因为它减少了您在使用指令(而不是制作)时必须编写的代码量”这实际上足以接受您的解决方案作为一个非常好的改进。非常感谢您的澄清:)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 2012-07-17
相关资源
最近更新 更多