La validació de formularis és una part essencial del desenvolupament d'aplicacions web, ja que garanteix que les dades introduïdes pels usuaris siguin correctes i compleixin amb els requisits especificats. En Angular, la validació de formularis es pot fer de manera senzilla i eficient utilitzant formularis basats en plantilles o formularis reactius.
Contingut
Introducció a la validació de formularis
La validació de formularis en Angular es pot realitzar de dues maneres principals:
- Formularis basats en plantilles: Utilitzen directives Angular en les plantilles HTML per gestionar la validació.
- Formularis reactius: Utilitzen el model de formulari reactiu d'Angular per gestionar la validació de manera programàtica.
Validació en formularis basats en plantilles
Exemple pràctic
A continuació, es mostra un exemple de com implementar la validació en un formulari basat en plantilles:
<form #userForm="ngForm" (ngSubmit)="onSubmit(userForm)">
<div>
<label for="name">Nom:</label>
<input type="text" id="name" name="name" ngModel required minlength="3">
<div *ngIf="userForm.submitted && userForm.controls.name.errors">
<small *ngIf="userForm.controls.name.errors.required">El nom és obligatori.</small>
<small *ngIf="userForm.controls.name.errors.minlength">El nom ha de tenir almenys 3 caràcters.</small>
</div>
</div>
<button type="submit">Enviar</button>
</form>Explicació
ngModel: Vincula el camp del formulari amb el model de dades.required: Marca el camp com a obligatori.minlength: Especifica la longitud mínima del camp.*ngIf: Mostra els missatges d'error si el formulari ha estat enviat i hi ha errors en el camp.
Controlador
import { Component } from '@angular/core';
@Component({
selector: 'app-user-form',
templateUrl: './user-form.component.html'
})
export class UserFormComponent {
onSubmit(form: any): void {
if (form.valid) {
console.log('Form Submitted!', form.value);
}
}
}Validació en formularis reactius
Exemple pràctic
A continuació, es mostra un exemple de com implementar la validació en un formulari reactiu:
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
@Component({
selector: 'app-user-form',
templateUrl: './user-form.component.html'
})
export class UserFormComponent implements OnInit {
userForm: FormGroup;
constructor(private fb: FormBuilder) {}
ngOnInit(): void {
this.userForm = this.fb.group({
name: ['', [Validators.required, Validators.minLength(3)]]
});
}
onSubmit(): void {
if (this.userForm.valid) {
console.log('Form Submitted!', this.userForm.value);
}
}
}Plantilla
<form [formGroup]="userForm" (ngSubmit)="onSubmit()">
<div>
<label for="name">Nom:</label>
<input type="text" id="name" formControlName="name">
<div *ngIf="userForm.get('name').touched && userForm.get('name').invalid">
<small *ngIf="userForm.get('name').errors.required">El nom és obligatori.</small>
<small *ngIf="userForm.get('name').errors.minlength">El nom ha de tenir almenys 3 caràcters.</small>
</div>
</div>
<button type="submit">Enviar</button>
</form>Explicació
FormBuilder: Servei per crear formularis reactius.FormGroup: Representa el formulari.Validators: Conjunt de validadors predefinits d'Angular.formControlName: Vincula el camp del formulari amb el control del formulari reactiu.
Errors comuns i consells
- Oblidar inicialitzar el formulari: Assegura't d'inicialitzar el formulari en el mètode
ngOnInit. - No gestionar els errors correctament: Utilitza
*ngIfper mostrar missatges d'error només quan el camp és invàlid i ha estat tocat o enviat. - No utilitzar validadors personalitzats quan sigui necessari: Si els validadors predefinits no cobreixen les teves necessitats, crea validadors personalitzats.
Exercicis pràctics
Exercici 1
Crea un formulari basat en plantilles que validi els següents camps:
- Correu electrònic (obligatori, format de correu electrònic)
- Contrasenya (obligatori, mínim 6 caràcters)
Solució
<form #loginForm="ngForm" (ngSubmit)="onSubmit(loginForm)">
<div>
<label for="email">Correu electrònic:</label>
<input type="email" id="email" name="email" ngModel required email>
<div *ngIf="loginForm.submitted && loginForm.controls.email.errors">
<small *ngIf="loginForm.controls.email.errors.required">El correu electrònic és obligatori.</small>
<small *ngIf="loginForm.controls.email.errors.email">El format del correu electrònic no és vàlid.</small>
</div>
</div>
<div>
<label for="password">Contrasenya:</label>
<input type="password" id="password" name="password" ngModel required minlength="6">
<div *ngIf="loginForm.submitted && loginForm.controls.password.errors">
<small *ngIf="loginForm.controls.password.errors.required">La contrasenya és obligatòria.</small>
<small *ngIf="loginForm.controls.password.errors.minlength">La contrasenya ha de tenir almenys 6 caràcters.</small>
</div>
</div>
<button type="submit">Enviar</button>
</form>Exercici 2
Crea un formulari reactiu que validi els següents camps:
- Nom d'usuari (obligatori, mínim 4 caràcters)
- Telèfon (obligatori, només números)
Solució
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
@Component({
selector: 'app-login-form',
templateUrl: './login-form.component.html'
})
export class LoginFormComponent implements OnInit {
loginForm: FormGroup;
constructor(private fb: FormBuilder) {}
ngOnInit(): void {
this.loginForm = this.fb.group({
username: ['', [Validators.required, Validators.minLength(4)]],
phone: ['', [Validators.required, Validators.pattern('^[0-9]*$')]]
});
}
onSubmit(): void {
if (this.loginForm.valid) {
console.log('Form Submitted!', this.loginForm.value);
}
}
}<form [formGroup]="loginForm" (ngSubmit)="onSubmit()">
<div>
<label for="username">Nom d'usuari:</label>
<input type="text" id="username" formControlName="username">
<div *ngIf="loginForm.get('username').touched && loginForm.get('username').invalid">
<small *ngIf="loginForm.get('username').errors.required">El nom d'usuari és obligatori.</small>
<small *ngIf="loginForm.get('username').errors.minlength">El nom d'usuari ha de tenir almenys 4 caràcters.</small>
</div>
</div>
<div>
<label for="phone">Telèfon:</label>
<input type="text" id="phone" formControlName="phone">
<div *ngIf="loginForm.get('phone').touched && loginForm.get('phone').invalid">
<small *ngIf="loginForm.get('phone').errors.required">El telèfon és obligatori.</small>
<small *ngIf="loginForm.get('phone').errors.pattern">El telèfon només pot contenir números.</small>
</div>
</div>
<button type="submit">Enviar</button>
</form>Resum
En aquesta secció, hem après com implementar la validació de formularis en Angular utilitzant tant formularis basats en plantilles com formularis reactius. Hem vist exemples pràctics i hem proporcionat exercicis per reforçar els conceptes apresos. La validació de formularis és una habilitat essencial per garantir la qualitat de les dades introduïdes pels usuaris i millorar l'experiència de l'usuari en les aplicacions web.
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
