Validation
"Validators"
Les constructeurs des "controls" (FormControl, FormGroup et FormArray) acceptent en second paramètre une liste de fonctions de validation appelées "validators".
Les "validators" natifs d'Angular sont regroupés sous forme de méthodes statiques das la classe Validators.
export class BookFormComponent {
bookForm = new FormGroup({
title: new FormControl(null, [
Validators.required
]),
description: new FormControl()
});
submitBook() {
console.log(this.bookForm.value);
}
}Remarquez que l'ajout du "validator" ne change pas le comportement du composant : la méthode submitBook continue à être appelée bien que la contrainte de validation ne soit pas respectée.
C'est au composant de décider de l'action à mener en fonction de l'état des "controls".
Les "controls" disposent d'une série de propriétés et de méthodes permettant d'en vérifier l'état :
valid: Valeur booléenne indiquant si le "control" est valide. Dans le cas d'unFormGroupouFormArray, le "control" est valide si les "controls" qui le composent sont tous valides.errors: "plain object" combinant les erreurs de tous les validateurs. Vautnullsi le "control" est valide.touched: Valeur booléenne positionnée àtruedès le déclenchement de l'événementblur(i.e. l'utilisateur change de "focus").pristine: Valeur booléenne indiquant si le "control" a été modifié.
Exemple de désactivation du "submit"
hasError & getError
hasError & getErrorLes méthodes hasError et getError sont deux méthodes "helpers" permettant d'accéder plus facilement aux informations d'erreur d'un "control".
Préférez les méthodes hasError et getError aux opérateurs ternaires (title.errors ? title.errors.required : null) !
"Validator" personnalisé
Un "validator" est une fonction qui est appelée à chaque changement de la valeur du "control" afin d'en vérifier la validité. Si la valeur est valide, le "control" retourne null ou un objet d'erreur dans le cas contraire.
"Validator" paramétré
Tels que le "validator" minLength, certains "validators" ont besoin de paramètres pour personnaliser leur comportement.
Dans ce cas, il suffit d'implémenter une "factory" de "validators" (i.e. : une fonction qui retourne des fonctions de type "validator").
Ou en utilisant le "currying" des Arrow Functions :
Le "validator" est alors personnalisé à l'utilisation :
"Async Validators"'
Il est parfois nécessaire d'implémenter des "validators" asynchrones (e.g. vérification distante via une API).
Un "validator" asynchrone se comporte de la même façon qu'un "validator" synchrone mais au lieu de retourner null ou un objet d'erreur, il doit retourner un Observable.
Les "validators" asynchrones peuvent être transmis au "control" par paramètre ordonné (3ème paramètre après la valeur initiale et les validators synchrones) mais il est préférable d'utiliser un objet plus explicite en guise de second paramètre :
Validators & "Dependency Injection"
Les "validators" (et plus particulièrement les "validators" asynchrones) ont parfois besoin d'accéder aux services (au sens Angular) mais sans Dependency Injection pour les "validators", l'astuce consiste à implémenter la "factory" du "validator" dans un service dédié afin de profiter de la "Dependency Injection".
Annulation des Observables
Dès la saisie d'une nouvelle valeur, l'Observable récupéré précédemment sera annulé avant de déclencher le traitement du nouvel Observable retourné (via un subscribe).
Personnalisation de l'affichage
Afin de faciliter la personnalisation du CSS en fonction de la validité des éléments du formulaire, Angular ajoute automatiquement les classes CSS suivantes en fonction de l'état du "control" :
.ng-valid.ng-invalid.ng-pending.ng-pristine.ng-dirty.ng-untouched.ng-touched
Mis à jour