Formulaires
Introduction
- 2 façons d'utiliser les formulaires : template base ou reactive
-
template base : à utiliser pour les formulaires simples seulement
- On utilise [(ngModel)] = "propriete" ou (ngModel) = "propriete" pour lier une propriété du composant à la valeur d'un champ selon si on veut une liaison de données ou une double liaison
-
reactive : liés aux modèles, plus facilement testables, mais un peu plus de code
Formulaires réactifs
- importer
FormsModuleetReactiveFormsModule (ngSubmit)="methode()"pour lancer une méthode à la soumission du formulaire
Exemple du composant (.ts)
- Créer des objets FormControl pour chaque champ
- Les grouper dans des FormGroup
import { Component, inject } from "@angular/core";
import { FormBuilder, FormGroup, Validators} from "@angular/forms";
...
export class ConnexionPage {
connectForm: FormGroup;
private formBuilder = inject(FormBuilder)
ngOnInit() {
this.connectForm = this.formBuilder.group({
//Façon "en ligne" de créer des FormControl
courriel: ["", [Validators.required, Validators.email]],
mdp: ["", Validators.required]
});
}
...
Exemple de la vue (.html)
<form [formGroup]="connectForm" (ngSubmit)="connexion()">
<div>
<label for="courriel">Courriel</label>
<input id="courriel" type="email" formControlName="courriel" />
</div>
<div>
<label for="mdp">Password</label>
<input id="mdp" type="password" formControlName="mdp" />
</div>
<button type="submit" [disabled]="connectForm.invalid">Register</button>
</form>
Validation
valid,invalid,dirty,pristine,submitted,touched,untouchedsont des états des champs et des formulaires- Utiliser ? dans les vues
*@if(loginInForm.controls.userName?.invalid)permet d'éviter la vérification explicite de la présence d'une propriété -
Des méthodes de validation sont fournies telles que
Validators.requiredetValidators.email -
Pour créer des méthodes personnalisées : écrire un méthode qui prend en paramètre
FormControl, et qui retourne un objet avec une clé et un message
private validCegep(control: FormControl): {[key: string]: any} {
return control.value.includes('cegepoutaouais.qc.ca') ?
null : {'validCegep': 'Doit être une adresse courriel du cégep'}
}
Pour utiliser une méthode personnalisée, l'ajouter dans la liste des méthodes de validation ex.: [Validators.required, Validators.email, this.validCegep]
Afficher les erreurs à l'utilisateur
Dans le template HTML il est possible d'afficher à l'utilisateur les messages de validation en temps réel.
On pourra utiliser @if d'Anngular pour vérifier si le formulaire contient des erreurs et afficher le message approprié.
Pour récupérer facilement le contenu des champs dans le template, il est suggéré de créer une fonction d'aide pour chaque champ du formulaire.
<div>
<label for="courriel">Courriel</label>
<input id="courriel" type="email" formControlName="courriel" />
@if(courriel?.invalid && (courriel?.dirty || courriel?.touched)) {
<!-- Vérification de chaque validateur et ajout du message correspondant -->
@if(courriel?.hasError('required')) {
<div class=text-danger>
Le champ est requis
</div>
}
@if(courriel?.hasError('email')) {
<div class=text-danger>
Veuillez entrer un courriel valide
</div>
}
}
</div>