Я использую следующую директиву для обнаружения и скрытия блока, если щелчок был вне конкретного элемента DOM:
import {
Directive,
ElementRef,
Output,
EventEmitter,
HostListener
} from "@angular/core";
@Directive({
selector: "[clickOutside]"
})
export class ClickOutsideDirective {
constructor(private _elementRef: ElementRef) {}
@Output()
public clickOutside = new EventEmitter();
@HostListener("document:click", ["$event.target"])
public onClick(targetElement) {
const clickedInside = this._elementRef.nativeElement.contains(
targetElement
);
this.clickOutside.emit(clickedInside);
}
}
Я применил эту директиву к элементу:
<div class="action" (click)="open()">Open</div>
<div
class="search_content"
*ngIf="_searchContentOpen"
clickOutside
(clickOutside)="clickOutside($event)"
></div>
Код компонента:
open(): void {
this._searchContentOpen = !this._searchContentOpen;
}
Проблема в том, что когда я вызываю щелчок, я устанавливаю this._searchContentOpen
в true / false.
В зависимости от этого я показываю блок, гдеДиректива применяется. Но директива работает всегда также в шаге, когда работает ngIf. Так как блок результата никогда не показывается.
Как это исправить?