Els formularis reactius a Angular proporcionen una manera més robusta i escalable de gestionar formularis complexos. A diferència dels formularis basats en plantilles, els formularis reactius es defineixen i gestionen completament en el codi TypeScript, oferint un major control i flexibilitat.
Objectius d'aquest tema
- Comprendre la diferència entre formularis basats en plantilles i formularis reactius.
- Aprendre a crear formularis reactius.
- Gestionar la validació de formularis reactius.
- Manipular i reaccionar als canvis en els formularis reactius.
Diferències clau entre formularis basats en plantilles i formularis reactius
Característica | Formularis basats en plantilles | Formularis reactius |
---|---|---|
Definició del formulari | HTML | TypeScript |
Validació | Directament en la plantilla | En el codi TypeScript |
Escalabilitat | Menys escalable | Més escalable |
Control sobre el formulari | Menys control | Més control |
Sincronització amb el model | Automàtica | Manual |
Creació d'un formulari reactiu
Passos per crear un formulari reactiu
-
Importar els mòduls necessaris:
import { ReactiveFormsModule } from '@angular/forms';
-
Definir el formulari en el component TypeScript:
import { Component } from '@angular/core'; import { FormGroup, FormControl, Validators } from '@angular/forms'; @Component({ selector: 'app-reactive-form', templateUrl: './reactive-form.component.html' }) export class ReactiveFormComponent { myForm: FormGroup; constructor() { this.myForm = new FormGroup({ name: new FormControl('', [Validators.required, Validators.minLength(3)]), email: new FormControl('', [Validators.required, Validators.email]), password: new FormControl('', [Validators.required, Validators.minLength(6)]) }); } onSubmit() { console.log(this.myForm.value); } }
-
Crear la plantilla HTML:
<form [formGroup]="myForm" (ngSubmit)="onSubmit()"> <label for="name">Name:</label> <input id="name" formControlName="name"> <div *ngIf="myForm.get('name').invalid && myForm.get('name').touched"> <small *ngIf="myForm.get('name').errors.required">Name is required.</small> <small *ngIf="myForm.get('name').errors.minlength">Name must be at least 3 characters long.</small> </div> <label for="email">Email:</label> <input id="email" formControlName="email"> <div *ngIf="myForm.get('email').invalid && myForm.get('email').touched"> <small *ngIf="myForm.get('email').errors.required">Email is required.</small> <small *ngIf="myForm.get('email').errors.email">Invalid email format.</small> </div> <label for="password">Password:</label> <input id="password" type="password" formControlName="password"> <div *ngIf="myForm.get('password').invalid && myForm.get('password').touched"> <small *ngIf="myForm.get('password').errors.required">Password is required.</small> <small *ngIf="myForm.get('password').errors.minlength">Password must be at least 6 characters long.</small> </div> <button type="submit" [disabled]="myForm.invalid">Submit</button> </form>
Explicació del codi
- FormGroup: Representa el formulari en si mateix. És un contenidor per a un conjunt de controls de formulari.
- FormControl: Representa un únic control de formulari, com un camp de text.
- Validators: S'utilitzen per aplicar regles de validació als controls de formulari.
Validació de formularis reactius
Els formularis reactius permeten definir validacions de manera programàtica. A l'exemple anterior, hem utilitzat els validators required
, minlength
i email
.
Manipulació i reacció als canvis
Els formularis reactius permeten reaccionar als canvis en els controls de formulari de manera senzilla:
Exercici pràctic
Objectiu
Crear un formulari reactiu que inclogui camps per a nom, correu electrònic i contrasenya, amb validacions adequades.
Instruccions
- Crea un nou component anomenat
UserFormComponent
. - Defineix un formulari reactiu amb els camps
name
,email
ipassword
. - Afegeix validacions per a cada camp:
name
: requerit, mínim 3 caràcters.email
: requerit, format de correu electrònic.password
: requerit, mínim 6 caràcters.
- Mostra missatges d'error adequats en la plantilla HTML.
- Afegeix un botó de submissió que només estigui habilitat si el formulari és vàlid.
Solució
user-form.component.ts:
import { Component } from '@angular/core'; import { FormGroup, FormControl, Validators } from '@angular/forms'; @Component({ selector: 'app-user-form', templateUrl: './user-form.component.html' }) export class UserFormComponent { userForm: FormGroup; constructor() { this.userForm = new FormGroup({ name: new FormControl('', [Validators.required, Validators.minLength(3)]), email: new FormControl('', [Validators.required, Validators.email]), password: new FormControl('', [Validators.required, Validators.minLength(6)]) }); } onSubmit() { console.log(this.userForm.value); } }
user-form.component.html:
<form [formGroup]="userForm" (ngSubmit)="onSubmit()"> <label for="name">Name:</label> <input id="name" formControlName="name"> <div *ngIf="userForm.get('name').invalid && userForm.get('name').touched"> <small *ngIf="userForm.get('name').errors.required">Name is required.</small> <small *ngIf="userForm.get('name').errors.minlength">Name must be at least 3 characters long.</small> </div> <label for="email">Email:</label> <input id="email" formControlName="email"> <div *ngIf="userForm.get('email').invalid && userForm.get('email').touched"> <small *ngIf="userForm.get('email').errors.required">Email is required.</small> <small *ngIf="userForm.get('email').errors.email">Invalid email format.</small> </div> <label for="password">Password:</label> <input id="password" type="password" formControlName="password"> <div *ngIf="userForm.get('password').invalid && userForm.get('password').touched"> <small *ngIf="userForm.get('password').errors.required">Password is required.</small> <small *ngIf="userForm.get('password').errors.minlength">Password must be at least 6 characters long.</small> </div> <button type="submit" [disabled]="userForm.invalid">Submit</button> </form>
Resum
En aquest tema, hem après a crear formularis reactius a Angular, a definir validacions i a gestionar els canvis en els controls de formulari. Els formularis reactius ofereixen un major control i escalabilitat, fent-los ideals per a aplicacions complexes. Hem vist com definir un formulari reactiu en el codi TypeScript i com mostrar missatges d'error en la plantilla HTML. A més, hem practicat aquests conceptes amb un exercici pràctic.
Curs d'Angular
Mòdul 1: Introducció a Angular
- Què és Angular?
- Configuració de l'entorn de desenvolupament
- Arquitectura d'Angular
- Primera aplicació Angular
Mòdul 2: Components d'Angular
- Comprendre els components
- Crear components
- Plantilles de components
- Estils de components
- Interacció de components
Mòdul 3: Enllaç de dades i directives
- Interpolació i enllaç de propietats
- Enllaç d'esdeveniments
- Enllaç de dades bidireccional
- Directives integrades
- Directives personalitzades
Mòdul 4: Serveis i injecció de dependències
Mòdul 5: Enrutament i navegació
Mòdul 6: Formularis a Angular
Mòdul 7: Client HTTP i observables
- Introducció al client HTTP
- Fer sol·licituds HTTP
- Gestionar respostes HTTP
- Utilitzar observables
- Gestió d'errors
Mòdul 8: Gestió d'estat
- Introducció a la gestió d'estat
- Utilitzar serveis per a la gestió d'estat
- NgRx Store
- NgRx Effects
- NgRx Entity
Mòdul 9: Proves a Angular
- Proves unitàries
- Proves de components
- Proves de serveis
- Proves de cap a cap
- Simulació de dependències
Mòdul 10: Conceptes avançats d'Angular
- Angular Universal
- Optimització del rendiment
- Internacionalització (i18n)
- Tubs personalitzats
- Animacions d'Angular