¿Cómo puedo detectar clics fuera de un componente en Angular?
html
events
angular
typescript
AMagyar
fuente
fuente
Respuestas:
Un ejemplo práctico: haga clic aquí
fuente
Una alternativa a la respuesta de AMagyar. Esta versión funciona cuando hace clic en el elemento que se elimina del DOM con un ngIf.
http://plnkr.co/edit/4mrn4GjM95uvSbQtxrAS?p=preview
fuente
La vinculación al clic del documento a través de @Hostlistener es costosa. Puede tener y tendrá un impacto visible en el rendimiento si lo abusa (por ejemplo, cuando crea un componente desplegable personalizado y tiene varias instancias creadas en un formulario).
Sugiero agregar un @Hostlistener () al evento de clic del documento solo una vez dentro de su componente principal de la aplicación. El evento debería empujar el valor del elemento objetivo en el que se hizo clic dentro de un sujeto público almacenado en un servicio de utilidad global.
Quien esté interesado en el elemento de destino en el que se hizo clic debe suscribirse al tema público de nuestro servicio de utilidades y darse de baja cuando se destruya el componente.
fuente
Las respuestas mencionadas anteriormente son correctas, pero ¿qué sucede si está haciendo un proceso pesado después de perder el enfoque del componente relevante? Para eso, vine con una solución con dos banderas donde el proceso de evento de enfoque solo se llevará a cabo cuando se pierda el enfoque solo del componente relevante.
Espero que esto te ayudará. Corrígeme si me he perdido algo.
fuente
Puede usar el métodoclickOutside () del paquete https://www.npmjs.com/package/ng-click-outside
fuente
La respuesta de ginalx debe establecerse como la predeterminada imo: este método permite muchas optimizaciones.
El problema
Digamos que tenemos una lista de elementos y que en cada elemento queremos incluir un menú que debe alternarse. Incluimos una palanca en un botón que escucha un
click
evento en sí mismo(click)="toggle()"
, pero también queremos cambiar el menú cada vez que el usuario hace clic fuera de él. Si la lista de elementos crece y adjuntamos un@HostListener('document:click')
en cada menú, entonces cada menú cargado dentro del elemento comenzará a escuchar el clic en todo el documento, incluso cuando el menú está desactivado. Además de los problemas obvios de rendimiento, esto es innecesario.Puede, por ejemplo, suscribirse cada vez que se activa la ventana emergente mediante un clic y comenzar a escuchar "clics externos" solo entonces.
Y en
*.component.html
:fuente
tap
operador. En su lugar, utiliceskipWhile(() => !this.isActive), switchMap(() => this._utilitiesService.documentClickedTarget), filter((target) => !this._elementRef.nativeElement.contains(target)), tap(() => this._toggleMenuSubject$.next(false))
. De esta manera, utiliza muchos más RxJ y omite algunas suscripciones.Mejorando @J. Frankenstein responde
fuente
Puedes llamar a la función de evento como (focusout) o (desenfoque) y luego pones tu código
fuente