Las directivas personalizadas en Angular permiten extender la funcionalidad de los elementos HTML de una manera reutilizable. A diferencia de las directivas incorporadas, que vienen predefinidas en Angular, las directivas personalizadas son creadas por el desarrollador para satisfacer necesidades específicas de la aplicación.
¿Qué es una Directiva Personalizada?
Una directiva personalizada es una clase de Angular que puede modificar el comportamiento de un elemento, componente o atributo en el DOM. Las directivas personalizadas se pueden clasificar en tres tipos:
- Directivas de Atributo: Modifican el comportamiento o el aspecto de un elemento.
- Directivas Estructurales: Cambian la estructura del DOM (por ejemplo,
*ngIf
,*ngFor
). - Componentes: Son directivas con una plantilla asociada.
En este tema, 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 personalizadas. Utiliza el siguiente comando para generar una directiva:
Este comando crea dos archivos: highlight.directive.ts
y highlight.directive.spec.ts
(para pruebas).
Paso 2: Implementar la Directiva
Vamos a implementar una directiva simple que resalta el texto de un elemento cuando el usuario pasa el ratón sobre él.
import { Directive, ElementRef, HostListener, Input } from '@angular/core'; @Directive({ selector: '[appHighlight]' }) export class HighlightDirective { @Input() defaultColor: string = 'yellow'; @Input('appHighlight') highlightColor: string; constructor(private el: ElementRef) {} @HostListener('mouseenter') onMouseEnter() { this.highlight(this.highlightColor || this.defaultColor); } @HostListener('mouseleave') onMouseLeave() { this.highlight(null); } private highlight(color: string) { this.el.nativeElement.style.backgroundColor = color; } }
Explicación del Código
- @Directive: Decorador que marca la clase como una directiva de Angular.
- selector: Define el nombre de la directiva. En este caso,
appHighlight
. - ElementRef: Servicio que proporciona una referencia al elemento DOM al que se aplica la directiva.
- @HostListener: Decorador que escucha eventos del host (el elemento al que se aplica la directiva).
- @Input: Decorador que permite que la directiva reciba valores de entrada.
Paso 3: Usar la Directiva en un Componente
Para usar la directiva, simplemente agrégala a un elemento en la plantilla de un componente:
<p appHighlight="lightblue" defaultColor="lightgreen">Pasa el ratón sobre este texto para resaltarlo.</p>
Ejercicio Práctico
Ejercicio 1: Crear una Directiva de Atributo Personalizada
Crea una directiva llamada appTextColor
que cambie el color del texto de un elemento cuando el usuario haga clic en él.
Solución:
-
Genera la directiva:
ng generate directive textColor
-
Implementa la directiva:
import { Directive, ElementRef, HostListener, Input } from '@angular/core'; @Directive({ selector: '[appTextColor]' }) export class TextColorDirective { @Input('appTextColor') textColor: string; constructor(private el: ElementRef) {} @HostListener('click') onClick() { this.changeTextColor(this.textColor || 'blue'); } private changeTextColor(color: string) { this.el.nativeElement.style.color = color; } }
-
Usa la directiva en un componente:
<p appTextColor="red">Haz clic en este texto para cambiar su color.</p>
Errores Comunes y Consejos
-
Olvidar importar la directiva en el módulo: Asegúrate de importar y declarar la directiva en el módulo correspondiente (
app.module.ts
o un módulo específico).import { TextColorDirective } from './text-color.directive'; @NgModule({ declarations: [ TextColorDirective, // otros componentes y directivas ], // ... }) export class AppModule { }
-
No usar el decorador @Input correctamente: Asegúrate de que los nombres de los inputs coincidan con los nombres utilizados en la plantilla.
Conclusión
Las directivas personalizadas son una herramienta poderosa en Angular que permite extender la funcionalidad de los elementos HTML de manera reutilizable. En este tema, aprendimos a crear una directiva de atributo personalizada, cómo implementarla y cómo usarla en un componente. También discutimos algunos errores comunes y consejos para evitarlos. En el próximo módulo, exploraremos los servicios y la inyección de dependencias en Angular.
Curso de Angular
Módulo 1: Introducción a Angular
- ¿Qué es Angular?
- Configuración del Entorno de Desarrollo
- Arquitectura de Angular
- Primera Aplicación Angular
Módulo 2: Componentes de Angular
- Entendiendo los Componentes
- Creación de Componentes
- Plantillas de Componentes
- Estilos de Componentes
- Interacción entre Componentes
Módulo 3: Enlace de Datos y Directivas
- Interpolación y Enlace de Propiedades
- Enlace de Eventos
- Enlace de Datos Bidireccional
- Directivas Incorporadas
- Directivas Personalizadas
Módulo 4: Servicios e Inyección de Dependencias
- Introducción a los Servicios
- Creación y Uso de Servicios
- Inyección de Dependencias
- Inyectores Jerárquicos
Módulo 5: Enrutamiento y Navegación
Módulo 6: Formularios en Angular
- Formularios Basados en Plantillas
- Formularios Reactivos
- Validación de Formularios
- Formularios Dinámicos
Módulo 7: Cliente HTTP y Observables
- Introducción al Cliente HTTP
- Realizando Solicitudes HTTP
- Manejo de Respuestas HTTP
- Uso de Observables
- Manejo de Errores
Módulo 8: Gestión de Estado
- Introducción a la Gestión de Estado
- Uso de Servicios para la Gestión de Estado
- NgRx Store
- NgRx Effects
- NgRx Entity
Módulo 9: Pruebas en Angular
- Pruebas Unitarias
- Pruebas de Componentes
- Pruebas de Servicios
- Pruebas de Extremo a Extremo
- Simulación de Dependencias
Módulo 10: Conceptos Avanzados de Angular
- Angular Universal
- Optimización del Rendimiento
- Internacionalización (i18n)
- Pipes Personalizados
- Animaciones en Angular