Aprende a dominar cómo una directiva en Angular puede escuchar eventos del usuario y modificar el DOM al mismo tiempo. Con HostBinding y HostListener, podrás resaltar elementos según su interacción, controlando la opacidad con incrementos por clic y manteniendo un contador de clics de forma clara y mantenible.
¿Qué es host binding y por qué es clave en Angular?
Usa HostBinding para editar atributos o estilos del elemento host directamente desde la directiva. Se importa desde Angular Core y permite vincular una propiedad de tu clase con un atributo del HTML, como un estilo.
Vincula la propiedad del componente al DOM del host.
Controla estilos como opacity sin tocar el HTML directamente.
Ideal para resaltar elementos según interacción del usuario.
¿Cómo se declara el binding al estilo opacity?
Se define una propiedad numérica y se vincula al estilo del host. El rango de la propiedad CSS opacity va de 0 a 1: 0 es transparente y 1 es totalmente opaco. Aquí se inicia en 0.1 para que el elemento empiece casi transparente.
¿Cómo combinar host listener y host binding para responder a clics?
Con HostListener puedes escuchar eventos como el clic y, a la vez, actualizar el estilo mediante la propiedad vinculada. Cada clic incrementa la opacidad en 0.1, además de actualizar el contador de clics existente.
¿Cómo se incrementa la opacidad en cada clic?
Se captura el evento click y se suma 0.1 a la propiedad vinculada. Así, los primeros clics llevan la opacidad de 0.1 a 0.2, 0.3, 0.4 y así sucesivamente.
@HostListener('click')onClick():void{this.opacity+=0.1;// Incrementa la opacidad en cada clic.// También se incrementa el contador de clics existente.}
Evento observado: click.
Cambio visual progresivo: de casi transparente a opaco.
Sin modificar el HTML del componente.
¿Qué problema hubo con el ancla y cómo se solucionó?
Aunque el conteo de clics funcionaba, la opacidad se veía siempre en 1. La causa: al elemento de ancla no se le aplicó correctamente ese estilo. La solución fue mover la directiva del <a> al <li> para que la opacidad sí cambiara visualmente.
¿Qué ajustes se hicieron en la directiva y el template?
Se actualizó el uso de la directiva para aplicarla al elemento li en lugar del ancla. Luego, tras refrescar, todos iniciaron con opacidad 0.1 y aumentaron con cada clic hasta ser totalmente opacos.
Aplicar la directiva al li en vez del ancla.
Verificar el cambio en el componente principal al usar la directiva.
Confirmar que la opacidad responde al clic y llega hasta 1.
Como cierre, se anticipa el siguiente módulo de estilos para mejorar la interfaz visual de forma notable. ¿Qué dudas o retos te surgieron al combinar HostBinding y HostListener? Comparte tu caso en los comentarios.
HostBinding en Angular: controla estilos desde directivas
Para eso exiten otras herramientas mas poderosas para hacer Analitycs, me refiero a un ejemplo mas real, estaba pensando en por ejemplo en llamar un servicio en cuanto el usuario de clic en un campo de texto para autocompleta ciertos campos.
Host Binding: Nos permite editar nuestros elementos del DOM, podemos agregar una clase o modificar directamente su estilo.
Host Listener: Con el podemos escuchar eventos que el usuario realice en el DOM. Recibe 3 parámetros los cuales son el evento, el objetivo del evento y el código a ejecutar.
A mí me está costando. Es muy estructurado y hay cosas que aún no logro entender completamente, solo las intuyo. Esperemos a ver en las siguientes clases qué pasa.
En la clase anterior, hay un aporte de armando187 dónde lo explica. Mediante el código indicado y colocando un Property Binding concreto en el <li> o en el <a> (según dónde lo tengas tú).
En mi caso en el <li> : {{lugar.clickN)}}
El resultado es que en cada elemento se actualiza automáticamente y se imprime la cantidad de clicks recibidos por dicho elemento .
A mi me ha funcionado perfectamente.
exportclassContarclicksDirective{//Ejemplod e hotslisteners clickN=0;//Que elemento del html vamos a editar este caso la opacidad @HostBinding('style.opacity') opacity: number=0.1;//evento y objetivo @HostListener('click',['$event.target'])onclick(btn){//codigo a ejecutarconsole.log('a', btn,"Numero de clicks:",this.clickN++);this.opacity+=.1;}```
con host binders puedes ocultar cierto? como seria el llamado? (hidden) variable:boolean=false; y luego mas adelante en el codigo del host listener cambias variable =true? y asi podria funcionar correctamente?
Sí, todo lo que indicas se podría hacer así, siguiendo el mismo ejemplo podrías hacerlo con @HostBinding('style.visibility') y seteando con hidden/visible, pero recuerda que para mostrar y ocultar ya existe la directiva “ngIf” que funcionaría para este caso, sin hacer un host binder.
numberOfClicks =0; @HostBinding('style.opacity') opacity: number =.5; @HostListener('click',['$event.target'])onClick(btn){console.log('button', btn,'number of clicks:',this.numberOfClicks++);console.log(this.opacity);this.opacity=this.opacity>=1.0?.5:this.opacity+.1;}
Mi ejercicio
en el directive.
import{Directive,HostListener}from'@angular/core';import{HostBinding}from'@angular/core';@Directive({selector:'li[contar-clicks]'})exportclassCambiarOpacityDirective{ clickN =0; @HostBinding('style.opacity') opacity: number =.1; @HostListener('click',['$event.target'])onclick(btn){console.log('a', btn,'numero de clicks: ',this.clickN++);this.opacity+=.5;}}
en el html
<h2>HostBinding</h2><ng-container *ngFor="let persona of personas"><li contar-clicks>{{persona.nombre}}-{{persona.edad}}</li></ng-container>
En el Modules
declarations:[/**declaracion de componentes o paginas**/AppComponent,CambiarOpacityDirective],