En Angular, las directivas son una de las características más poderosas y flexibles. Permiten modificar el comportamiento del DOM de una manera declarativa. En esta sección, aprenderemos cómo crear nuestras propias directivas personalizadas para extender la funcionalidad de nuestras aplicaciones Angular.

¿Qué es una Directiva?

Una directiva en Angular es una clase que puede modificar el DOM de una manera específica. Existen tres tipos principales de directivas:

  1. Directivas de Atributo: Modifican el comportamiento de un elemento, atributo o componente existente.
  2. Directivas Estructurales: Cambian la estructura del DOM, añadiendo o eliminando elementos.
  3. Componentes: Son directivas con una plantilla asociada.

En esta sección, nos enfocaremos en las directivas de atributo personalizadas.

Creación de una Directiva Personalizada

Paso 1: Generar la Directiva

Angular CLI facilita la creación de directivas. Utilizaremos el siguiente comando para generar una directiva llamada highlight:

ng generate directive highlight

Este comando crea dos archivos:

  • highlight.directive.ts: Contiene la lógica de la directiva.
  • highlight.directive.spec.ts: Contiene las pruebas unitarias para la directiva.

Paso 2: Implementar la Directiva

Abrimos el archivo highlight.directive.ts y modificamos el contenido para que nuestra directiva cambie el color de fondo del elemento al que se aplica.

import { Directive, ElementRef, Renderer2, HostListener } from '@angular/core';

@Directive({
  selector: '[appHighlight]'
})
export class HighlightDirective {

  constructor(private el: ElementRef, private renderer: Renderer2) { }

  @HostListener('mouseenter') onMouseEnter() {
    this.highlight('yellow');
  }

  @HostListener('mouseleave') onMouseLeave() {
    this.highlight(null);
  }

  private highlight(color: string) {
    this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', color);
  }
}

Explicación del Código

  • ElementRef: Permite acceder al elemento del DOM al que se aplica la directiva.
  • Renderer2: Proporciona una forma segura y abstracta de manipular el DOM.
  • @HostListener: Escucha eventos del host (el elemento al que se aplica la directiva).

La directiva HighlightDirective cambia el color de fondo del elemento a amarillo cuando el ratón entra en el elemento (mouseenter) y lo restablece cuando el ratón sale (mouseleave).

Paso 3: Usar la Directiva en una Plantilla

Para utilizar la directiva, simplemente añadimos el selector appHighlight al elemento en la plantilla de un componente.

<p appHighlight>Hover over this text to see the highlight effect.</p>

Ejercicio Práctico

Objetivo: Crear una directiva personalizada que cambie el color del texto cuando se hace clic en el elemento.

  1. Genera una nueva directiva llamada textColor.
  2. Implementa la lógica para cambiar el color del texto a rojo cuando se hace clic en el elemento.
  3. Usa la directiva en una plantilla.

Solución:

  1. Generar la directiva:
ng generate directive textColor
  1. Implementar la lógica en textColor.directive.ts:
import { Directive, ElementRef, Renderer2, HostListener } from '@angular/core';

@Directive({
  selector: '[appTextColor]'
})
export class TextColorDirective {

  constructor(private el: ElementRef, private renderer: Renderer2) { }

  @HostListener('click') onClick() {
    this.changeTextColor('red');
  }

  private changeTextColor(color: string) {
    this.renderer.setStyle(this.el.nativeElement, 'color', color);
  }
}
  1. Usar la directiva en una plantilla:
<p appTextColor>Click on this text to change its color to red.</p>

Errores Comunes y Consejos

  • No olvidar declarar la directiva en el módulo: Asegúrate de añadir la directiva en la sección declarations del módulo correspondiente.
  • Uso incorrecto de ElementRef: Evita manipular el DOM directamente usando ElementRef. Utiliza Renderer2 para mantener la seguridad y compatibilidad con diferentes plataformas.
  • Selector incorrecto: Asegúrate de que el selector de la directiva esté correctamente definido y utilizado en la plantilla.

Conclusión

Las directivas personalizadas en Angular son una herramienta poderosa para modificar el comportamiento del DOM de manera declarativa. En esta sección, aprendimos a crear una directiva de atributo personalizada que cambia el color de fondo de un elemento. También vimos cómo utilizar ElementRef, Renderer2 y @HostListener para implementar la lógica de la directiva. Con esta base, puedes crear directivas más complejas y adaptarlas a las necesidades específicas de tu aplicación.

En el próximo módulo, exploraremos los servicios y la inyección de dependencias en Angular, lo que nos permitirá compartir datos y lógica entre diferentes partes de nuestra aplicación.

Curso de Angular 2+

Módulo 1: Introducción a Angular

Módulo 2: Conceptos Básicos de TypeScript

Módulo 3: Componentes y Plantillas

Módulo 4: Directivas y Pipes

Módulo 5: Servicios e Inyección de Dependencias

Módulo 6: Enrutamiento y Navegación

Módulo 7: Formularios en Angular

Módulo 8: Cliente HTTP y Observables

Módulo 9: Gestión de Estado

Módulo 10: Pruebas en Angular

Módulo 11: Temas Avanzados

Módulo 12: Despliegue y Mejores Prácticas

© Copyright 2024. Todos los derechos reservados