Comment détecter les clics extérieur un composant dans Angular?
import { Component, ElementRef, HostListener, Input } from '@angular/core';
@Component({
selector: 'selector',
template: `
<div>
{{text}}
</div>
`
})
export class AnotherComponent {
public text: String;
@HostListener('document:click', ['$event'])
clickout(event) {
if(this.eRef.nativeElement.contains(event.target)) {
this.text = "clicked inside";
} else {
this.text = "clicked outside";
}
}
constructor(private eRef: ElementRef) {
this.text = 'no clicks yet';
}
}
Une alternative à la réponse d'AMagyar. Cette version fonctionne lorsque vous cliquez sur un élément qui est supprimé du DOM avec un ngIf.
http://plnkr.co/edit/4mrn4GjM95uvSbQtxrAS?p=preview
private wasInside = false;
@HostListener('click')
clickInside() {
this.text = "clicked inside";
this.wasInside = true;
}
@HostListener('document:click')
clickout() {
if (!this.wasInside) {
this.text = "clicked outside";
}
this.wasInside = false;
}
Les réponses mentionnées ci-dessus sont correctes, mais que se passe-t-il si vous effectuez un processus complexe après avoir perdu le focus du composant concerné? Pour cela, je suis arrivé avec une solution avec deux indicateurs dans lesquels le processus d’événement de focalisation n’aurait lieu que lorsqu’on perdrait le focus du composant concerné uniquement.
isFocusInsideComponent = false;
isComponentClicked = false;
@HostListener('click')
clickInside() {
this.isFocusInsideComponent = true;
this.isComponentClicked = true;
}
@HostListener('document:click')
clickout() {
if (!this.isFocusInsideComponent && this.isComponentClicked) {
// do the heavy process
this.isComponentClicked = false;
}
this.isFocusInsideComponent = false;
}
J'espère que cela vous aidera. Corrigez-moi si j'ai manqué quelque chose.
Vous pouvez utiliser la méthode useclickOutside () à partir de https://www.npmjs.com/package/ng-click-outside package