Introducció
Les directives són una de les característiques més potents d'Angular. Permeten modificar el comportament dels elements del DOM de manera declarativa. En aquest tema, aprendrem a crear directives personalitzades per afegir funcionalitats específiques als nostres components.
Objectius
- Entendre què són les directives personalitzades.
- Aprendre a crear directives personalitzades.
- Aplicar directives personalitzades en components Angular.
- Veure exemples pràctics d'ús de directives personalitzades.
Què són les directives personalitzades?
Les directives personalitzades són directives creades per l'usuari que permeten afegir comportaments específics als elements del DOM. A diferència de les directives integrades, que venen amb Angular, les directives personalitzades es creen per satisfer necessitats específiques de l'aplicació.
Creació d'una directiva personalitzada
Pas 1: Crear la directiva
Per crear una directiva personalitzada, utilitzarem l'Angular CLI. Executa la següent comanda en el terminal:
Això crearà un fitxer highlight.directive.ts amb el següent contingut:
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ó del codi
- @Directive: Decorador que marca la classe com una directiva Angular.
- selector: El selector CSS que s'utilitzarà per aplicar la directiva. En aquest cas,
[appHighlight]indica que la directiva s'aplicarà a qualsevol element que tingui l'atributappHighlight. - ElementRef: Servei que proporciona una referència a l'element del DOM al qual s'aplica la directiva.
- Renderer2: Servei que permet manipular els elements del DOM de manera segura.
- @HostListener: Decorador que permet escoltar esdeveniments de l'element del DOM. En aquest cas, escoltem els esdeveniments
mouseenterimouseleaveper canviar el color de fons de l'element.
Pas 2: Utilitzar la directiva en un component
Ara que hem creat la nostra directiva, podem utilitzar-la en un component. Suposem que tenim el següent component:
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
template: `
<h1 appHighlight>Passa el ratolí per sobre d'aquest text!</h1>
`,
styleUrls: ['./app.component.css']
})
export class AppComponent {}Explicació del codi
- appHighlight: Atribut que aplica la directiva
HighlightDirectivea l'element<h1>. Quan el ratolí passa per sobre del text, el color de fons canvia a groc.
Exercicis pràctics
Exercici 1: Crear una directiva per canviar el color del text
Crea una directiva anomenada TextColorDirective que canviï el color del text quan el ratolí passa per sobre d'un element.
Solució
- Genera la directiva:
- Implementa la directiva:
import { Directive, ElementRef, Renderer2, HostListener } from '@angular/core';
@Directive({
selector: '[appTextColor]'
})
export class TextColorDirective {
constructor(private el: ElementRef, private renderer: Renderer2) {}
@HostListener('mouseenter') onMouseEnter() {
this.changeColor('blue');
}
@HostListener('mouseleave') onMouseLeave() {
this.changeColor(null);
}
private changeColor(color: string) {
this.renderer.setStyle(this.el.nativeElement, 'color', color);
}
}- Utilitza la directiva en un component:
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
template: `
<p appTextColor>Passa el ratolí per sobre d'aquest text per canviar el color!</p>
`,
styleUrls: ['./app.component.css']
})
export class AppComponent {}Exercici 2: Crear una directiva per afegir una classe CSS
Crea una directiva anomenada AddClassDirective que afegeixi una classe CSS a un element quan es faci clic sobre ell.
Solució
- Genera la directiva:
- Implementa la directiva:
import { Directive, ElementRef, Renderer2, HostListener } from '@angular/core';
@Directive({
selector: '[appAddClass]'
})
export class AddClassDirective {
constructor(private el: ElementRef, private renderer: Renderer2) {}
@HostListener('click') onClick() {
this.renderer.addClass(this.el.nativeElement, 'highlight');
}
}- Defineix la classe CSS en
styles.css:
- Utilitza la directiva en un component:
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
template: `
<div appAddClass>Fes clic aquí per afegir una classe CSS!</div>
`,
styleUrls: ['./app.component.css']
})
export class AppComponent {}Resum
En aquest tema, hem après a crear directives personalitzades en Angular. Hem vist com utilitzar ElementRef i Renderer2 per manipular elements del DOM de manera segura, i hem après a escoltar esdeveniments del DOM amb @HostListener. També hem practicat amb exemples pràctics per reforçar els conceptes apresos. Les directives personalitzades són una eina poderosa per afegir comportaments específics als nostres components Angular.
Curs d'Angular 2+
Mòdul 1: Introducció a Angular
- Què és Angular?
- Configuració de l'entorn de desenvolupament
- La teva primera aplicació Angular
- Arquitectura d'Angular
Mòdul 2: Conceptes bàsics de TypeScript
- Introducció a TypeScript
- Variables i tipus de dades en TypeScript
- Funcions i funcions fletxa
- Classes i interfícies
Mòdul 3: Components i plantilles
Mòdul 4: Directives i pipes
Mòdul 5: Serveis i injecció de dependències
Mòdul 6: Enrutament i navegació
Mòdul 7: Formularis en Angular
Mòdul 8: Client HTTP i observables
- Introducció al client HTTP
- Realització de sol·licituds HTTP
- Gestió de respostes HTTP
- Ús d'observables
