Chargement...

Validation des formulaires

Exemple de Base

typescript
TYPESCRIPT Code
import { 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

typescript
TYPESCRIPT Code
import { 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

Prêt à Commencer

Testez Vos Connaissances

Mettez-vous au défi avec ce quiz interactif et voyez à quel point vous comprenez le sujet

4
Questions
🎯
70%
Pour Réussir
♾️
Temps
🔄
Tentatives

📝 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