Comment puis-je détecter les clics en dehors d' un composant dans Angular?
html
events
angular
typescript
AMagyar
la source
la source
Réponses:
Un exemple de travail - cliquez ici
la source
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
la source
La liaison au clic de document via @Hostlistener est coûteuse. Il peut avoir et aura un impact visible sur les performances si vous en abusez (par exemple, lors de la création d'un composant de liste déroulante personnalisé et que vous avez plusieurs instances créées dans un formulaire).
Je suggère d'ajouter un @Hostlistener () à l'événement de clic sur le document une seule fois dans le composant principal de votre application. L'événement doit pousser la valeur de l'élément cible sur lequel l'utilisateur a cliqué dans un sujet public stocké dans un service utilitaire global.
Quiconque est intéressé par l'élément cible cliqué doit s'abonner au sujet public de notre service utilitaires et se désabonner lorsque le composant est détruit.
la source
Les réponses mentionnées ci-dessus sont correctes, mais que se passe-t-il si vous effectuez un processus difficile après avoir perdu l'attention du composant concerné. Pour cela, je suis venu avec une solution avec deux indicateurs où le processus d'événement de mise au point n'aura lieu que lors de la perte du focus du composant pertinent uniquement.
J'espère que ceci vous aidera. Corrigez-moi si vous avez manqué quelque chose.
la source
Vous pouvez utiliser la méthodeeclickOutside () à partir de https://www.npmjs.com/package/ng-click-outside package
la source
La réponse de ginalx doit être définie par défaut imo: cette méthode permet de nombreuses optimisations.
Le problème
Disons que nous avons une liste d'éléments et que sur chaque élément, nous voulons inclure un menu qui doit être basculé. Nous incluons une bascule sur un bouton qui écoute un
click
événement sur lui(click)="toggle()"
- même , mais nous voulons également basculer le menu chaque fois que l'utilisateur clique en dehors de celui-ci. Si la liste des éléments s'allonge et que nous attachons un@HostListener('document:click')
à chaque menu, alors chaque menu chargé dans l'élément commencera à écouter le clic sur tout le document, même lorsque le menu est désactivé. Outre les problèmes de performances évidents, cela n'est pas nécessaire.Vous pouvez, par exemple, vous abonner chaque fois que le popup est basculé via un clic et commencer à écouter les "clics extérieurs" seulement alors.
Et, dans
*.component.html
:la source
tap
opérateur. Utilisez plutôtskipWhile(() => !this.isActive), switchMap(() => this._utilitiesService.documentClickedTarget), filter((target) => !this._elementRef.nativeElement.contains(target)), tap(() => this._toggleMenuSubject$.next(false))
. De cette façon, vous utilisez beaucoup plus de RxJ et sautez certains abonnements.Améliorer @J. Frankenstein answear
la source
vous pouvez appeler la fonction d'événement comme (focusout) ou (flou) puis vous mettez votre code
la source