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
*ngIf
per 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