C'est quoi les Formulaires ?
Dans Angular, il existe deux types de formulaires :
- Les formulaires réactifs
- Les formulaires template-driven
Bien que les deux types de formulaires permettent de faire la mĂȘme chose, leurs utilisations diffĂšrent et ont des avantages et des inconvĂ©nients.
Les formulaires réactifs (ReactiveFormsModule)
Le principe des formulaires réactifs est de créer un objet qui représente le formulaire. Cet objet est ensuite lié à un <form>
dans le template.
Par exemple, imaginons un formulaire qui permet de créer un utilisateur :
import { Component } from "@angular/core";
import { FormGroup, Validators, ReactiveFormsModule } from "@angular/forms";
@Component({
standalone: true,
template: `
<form [formGroup]="form" (ngSubmit)="onSubmit()">
<div>
<label for="name">Nom</label>
<input type="text" id="name" formControlName="name" />
</div>
<div>
<label for="email">Email</label>
<input type="email" id="email" formControlName="email" />
</div>
<button type="submit">Envoyer</button>
</form>
`,
imports: [ReactiveFormsModule],
})
export class UserFormComponent {
protected readonly form = new FormGroup({
name: new FormControl("", Validators.required),
email: new FormControl("", [Validators.required, Validators.email]),
});
onSubmit() {
if (this.form.valid) {
// Envoi du formulaire
}
}
}
La premiÚre étape consiste à importer ReactiveFormsModule
, cela permet dâavoir accĂšs aux directives formGroup
et formControlName
et Ă©galement dâajouter lâevent ngSubmit
sur le <form>
.
Ensuite, il faut créer un objet FormGroup
qui représente le formulaire. Cet objet est composé de plusieurs FormControl
qui représentent les champs du formulaire avec leurs valeurs initiales et leurs validateurs.
Enfin, il faut lier le FormGroup
au <form>
avec la directive formGroup
et chaque FormControl
aux champs du formulaire avec la directive formControlName
.
Maintenant, il ne me reste plus quâĂ soumettre le formulaire en appelant la mĂ©thode onSubmit()
lorsque le formulaire est valide.
Les formulaires template-driven (FormsModule)
Les formulaires template-driven, eux, sont entiÚrement gérés par le template.
Par exemple, imaginons un formulaire qui permet de créer un utilisateur :
import { Component } from "@angular/core";
import { NgForm, FormsModule } from "@angular/forms";
@Component({
standalone: true,
template: `
<form (ngSubmit)="onSubmit()">
<div>
<label for="name">Nom</label>
<input
type="text"
id="name"
name="name"
[(ngModel)]="user.name"
required
/>
</div>
<div>
<label for="email">Email</label>
<input
type="email"
id="email"
name="email"
[(ngModel)]="user.email"
required
email
/>
</div>
<button type="submit">Envoyer</button>
</form>
`,
imports: [FormsModule],
})
export class UserFormComponent {
user = {
name: "",
email: "",
};
onSubmit() {
if (user.name && user.email) {
// Envoi du formulaire
console.log(this.user);
}
}
}
Tout comme pour les formulaires réactifs, il faut importer FormsModule
pour avoir accĂšs aux directives ngForm
, ngModel
et ngSubmit
.
Mais tout le reste est trÚs différent.
Ici, lâintelligence du formulaire est entiĂšrement pilotĂ©e par le template, câest Ă dire que les champs sont reliĂ©s au formulaire grĂące Ă la directive ngModel
et le formulaire est lié à une variable locale (#form
) avec la directive ngForm
que nous passons en paramĂštre de onSubmit
. Egalement, les validateurs sont passés en attributs des champs.
ReactiveFormsModule vs FormsModule
Câest un grand dĂ©bat ! GĂ©nĂ©ralement lorsque vous commencez Ă utiliser Angular, vous utilisez les formulaires template-driven car ils sont plus simples Ă mettre en place. Mais plus tard, on vous recommande dâutiliser les formulaires rĂ©actifs car ils sont plus puissants et plus flexibles.
Et un jour vous tombez sur des articles ou vidĂ©os de Ward Bell, Tim Deschryver ou encore Brecht Billiet qui prĂȘchent pour lâutilisation des templates driven forms. Et lĂ , vous ne savez plus quoi faire !
Ce que je recommande, câest dĂ©jĂ dâexpĂ©rimenter les deux façons de faire pour bien ressentir le feeling dâutilisation de chacun.
Ma prĂ©fĂ©rence personnelle va lĂ©gĂšrement pour les templates driven forms, surtout en combinaison avec les Signal. On obtient sensiblement le mĂȘme rĂ©sultat quâavec les reactive forms mais avec moins de code et plus de simplicitĂ©.
Il est Ă parier que lorsque lâAPI des formulaires seront revisitĂ©es par lâĂ©quipe dâAngular (car cela arrivera), la solution sera plus proche de la solution des templates driven forms que des reactive forms.