Creación y Uso de Directivas en Angular para Manipular el DOM
Resumen
Angular utiliza el concepto de directiva para cambiar la apariencia o el comportamiento de un elemento en el HTML. Acá estaremos conociendo las directivas.
Tu primera directiva
Para crear tu primera directiva, es necesario usar el CLI de Angular con el comando ng generate directive test-name o en su forma corta ng g d test-name.
Al igual que con los servicios y los pipelines, el comando CLI creará un archivo .ts con el código de tu directiva y un archivo .spec.ts para sus respectivas pruebas unitarias.
El CLI también actualizará el archivo app.module.ts importando la directiva en las declarations[]. No olvides de asegurarte que se esté importando correctamente. De lo contrario, Angular no reconocerá la directiva.
Las directivas por defecto tienen el siguiente aspecto:
Otra posibilidad que ofrecen las directivas, es la escucha de eventos. Haciendo uso del decorador @HostListener() e importado desde @angular/core puedes ejecutar una función cada vez que se produce un clic, hover, scroll o cualquier otro evento.
<div><pappChangeColor[color]="'blue'">Texto color azul.</p></div><div><pappChangeColor[color]="'red'">Texto color rojo.</p></div><div><pappChangeColor[color]="'green'">Texto color verde.</p></div>
Puede ser algo difícil si recién estás comenzando con Angular imaginar un buen uso para una directiva propia. De momento, es importante saber que existen para poder implementarlas cuando llegue ese momento.
Un ejemplo mas podria ser de utlizar una directica que escuche el evento error de una imagen si para luego poner a dicha imagen una imagen por default
@Directive({selector:'[imageError]'})exportclassImageErrorDirective{//escucha el evento error @HostListener('error')handleError():void{this.elment.nativeElement.src="https://www.sam-manipulados.com/wp-content/uploads/2014/01/default_image_01.png";}constructor(privateelment:ElementRef<HTMLImageElement>){console.log( elment );}}//template<img imageError width="100px"[src]="image" alt="">
Muy buena opción, se me ocurre también que añadiendo un @input en tu código podríamos pasar la imagen por defecto de modo que la directiva la podamos utilizar en diversos sitios.
Entonces las directivas se usan solo para modificar el DOM, pero no es recomendable hacer estas modificaciones al DOM de está manera según la documentación de Angular. Lo que quiere decir que no tiene mucha utilidad crear directivas.
Estoy en lo correcto?
Tambien quede con la misma duda
Creo que las directivas custom son mas útiles cuando tienes que integrar alguna librería de terceros a tu proyecto, por ejemplo: si tenes que agregar el botón de inicio de sesión de Google a un elemento en particular, un div podría ser, en este caso necesitas acceder a la referencia del elemento para renderizar en el dicho botón.
Directivas
Las directivas se usan para modificar el DOM de forma directa y también se pueden modificar los atributos.
Aplicar cambios al nativeElement no se recomienda con hacer así.
Es mejor usar Render2
Tal parece, sino habria que buscar ejemplos de directivas super utiles, porque todo lo que se puede hacer con directivas se puede realizar de forma manual
Tal vez capas también sirva para separar la lógica de un elemento en especifico pero bueno, es otro tema
Nicolas, la documentación de Angular hace esta aclaración sobre "nativeEment : Utilice esta API como último recurso cuando se necesite acceso directo a DOM. En su lugar, use plantillas y enlaces de datos proporcionados por Angular. Alternativamente, puede echar un vistazo a Renderer2, que proporciona una API que se puede utilizar de forma segura incluso cuando no se admite el acceso directo a elementos nativos."
Qué tipo de inconvenientes puede generar para que la coloquen como ultimo recursos y recomienden otra?
Es una muy buena advertencia, ya que Angular por detrás se encarga de hacer toda la manipulación de DOM necesaria y deberíamos evitar esto de ser posible, pero cuando lo tenemos que hacer una directiva sería una buena forma.
También he leído sobre esto que es mejor utilizar Renderer2, según leí es por el hecho que con la forma que nos enseño Nico sólo se puede utilizar en los navegadores pero si quieres que se ejecute en appmovil, webworkers y bueno todo lo que no sea navegador se debe usar Renderer2 ya que si no no funcionaría.
'
Aunque también utilizan lo de ElementRef para referenciar el objeto, os pongo como sería, simplemente es cambiar:
La clase Redenderer2 tiene una serie de métodos para la manipulación del DOM os dejo enlace: Enlace a la página de Renderer2
'
No se si esta es la mejor forma de hacerlo o habría otra, pero os lo dejo por si os sirve de utilidad.