Validation des formulaires
Exemple de Base
typescriptimport { Component } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
@Component({
selector: 'app-basic-form',
template: `
<form [formGroup]="userForm" (ngSubmit)="onSubmit()"> <label for="username">Nom d'utilisateur :</label> <input id="username" formControlName="username" />
<div *ngIf="userForm.get('username')?.invalid && userForm.get('username')?.touched">
Le nom d'utilisateur est requis et doit contenir au moins 4 caractères. </div>
<label for="email">Email :</label>
<input id="email" formControlName="email" />
<div *ngIf="userForm.get('email')?.invalid && userForm.get('email')?.touched">
Veuillez entrer une adresse email valide.
</div>
<button type="submit" [disabled]="userForm.invalid">Envoyer</button>
</form>
`
})
export class BasicFormComponent {
userForm: FormGroup;
constructor(private fb: FormBuilder) {
this.userForm = this.fb.group({
username: ['', [Validators.required, Validators.minLength(4)]],
email: ['', [Validators.required, Validators.email]]
});
}
onSubmit() {
if (this.userForm.valid) {
console.log('Formulaire soumis :', this.userForm.value);
}
}
}
Dans cet exemple de base, nous créons un formulaire réactif Angular en utilisant FormBuilder et FormGroup, ce qui centralise la gestion de l'état du formulaire. Les champs username et email utilisent des validateurs intégrés : Validators.required, Validators.minLength et Validators.email. Dans le template, les contrôles sont liés via formControlName, et les messages d'erreur s'affichent avec *ngIf lorsque le contrôle est invalide et touché. Cette approche reflète la pensée basée sur les composants, en maintenant un flux de données unidirectionnel et en évitant le prop drilling ou les re-renders inutiles.
Exemple Pratique
typescriptimport { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { debounceTime } from 'rxjs/operators';
@Component({
selector: 'app-advanced-form',
template: `
<form [formGroup]="profileForm" (ngSubmit)="submitProfile()"> <label for="fullName">Nom complet :</label> <input id="fullName" formControlName="fullName" />
<div *ngIf="profileForm.get('fullName')?.invalid && profileForm.get('fullName')?.touched">
Le nom complet est requis et doit contenir au moins 4 caractères. </div>
<label for="email">Email :</label>
<input id="email" formControlName="email" />
<div *ngIf="profileForm.get('email')?.invalid && profileForm.get('email')?.touched">
Veuillez entrer une adresse email valide.
</div>
<label for="age">Âge :</label>
<input id="age" type="number" formControlName="age" />
<div *ngIf="profileForm.get('age')?.invalid && profileForm.get('age')?.touched">
L'âge doit être compris entre 18 et 99 ans.
</div>
<button type="submit" [disabled]="profileForm.invalid">Enregistrer</button>
</form>
`
})
export class AdvancedFormComponent implements OnInit {
profileForm: FormGroup;
constructor(private fb: FormBuilder) {}
ngOnInit() {
this.profileForm = this.fb.group({
fullName: ['', [Validators.required, Validators.minLength(4)]],
email: ['', [Validators.required, Validators.email]],
age: [null, [Validators.required, Validators.min(18), Validators.max(99)]]
});
this.profileForm.valueChanges.pipe(debounceTime(300)).subscribe(value => {
console.log('Changements du formulaire :', value);
});
}
submitProfile() {
if (this.profileForm.valid) {
console.log('Profil enregistré :', this.profileForm.value);
}
}
}
Dans cet exemple avancé, nous ajoutons un champ âge avec Validators.min et Validators.max pour valider la plage acceptable. La propriété valueChanges est observée avec debounceTime pour limiter les re-renders inutiles et optimiser la performance. Cette technique exploite les hooks du cycle de vie d'Angular et maintient un flux de données clair sans mutations directes, évitant le prop drilling.
📊 Tableau de Référence
Angular Element/Concept | Description | Usage Example |
---|---|---|
FormGroup | Conteneur pour plusieurs contrôles de formulaire | this.fb.group({fullName: ['', Validators.required]}) |
FormControl | Représente un contrôle de formulaire individuel | new FormControl('', Validators.email) |
FormBuilder | Service pour simplifier la création de formulaires | constructor(private fb: FormBuilder) |
valueChanges | Observable pour suivre les changements du formulaire | this.profileForm.valueChanges.subscribe(value => ...) |
ngSubmit | Événement déclenché lors de la soumission du formulaire | <form (ngSubmit)="submitProfile()"> |
🧠 Testez Vos Connaissances
Testez Vos Connaissances
Mettez-vous au défi avec ce quiz interactif et voyez à quel point vous comprenez le sujet
📝 Instructions
- Lisez chaque question attentivement
- Sélectionnez la meilleure réponse pour chaque question
- Vous pouvez refaire le quiz autant de fois que vous le souhaitez
- Votre progression sera affichée en haut