INVALID
, soit la valeur null
, qui donne un statut VALID
.ngModel
une variable de modèle locale.
L'exemple suivant exporte dans NgModel
une variable appelée name
:‹input›
porte les attributs de validation HTML
: required
et minlength
. Il porte également une directive validateur personnalisé, forbiddenName
.#name="ngModel"
exporte NgModel
dans une variable locale appelée name
. NgModel
reflète de nombreuses propriétés de son instance FormControl
sous-jacente, vous pouvez donc l'utiliser dans le modèle pour vérifier les états de contrôle tels que valid
et dirty
.*ngIf
sur l'élément ‹div›
révèle un ensemble de messages divs
imbriqués, mais uniquement si le name
est invalide et que le contrôle est dirty
ou touched
.‹div›
imbriqué peut présenter un message personnalisé pour l'une des erreurs de validation possibles. Il y a des messages pour required
, minlength
et forbiddenName
.dirty
et touched
empêcher les erreurs de s'afficher jusqu'à ce que l'utilisateur fasse l'une des deux choses suivantes : modifie la
valeur en rendant le contrôle sale
; ou rend flou l'élément de contrôle de formulaire, en définissant le contrôle sur touché.null
.
Vous pouvez les passer comme deuxième argument lorsque vous instanciez un FormControl
.
null
. Vous pouvez les passer comme troisième argument lorsque vous instanciez un FormControl
.
required
et minlength
, sont tous disponibles pour être utilisés en tant que fonctions de la classe Validators
. Hero
afin qu'il devienne un formulaire réactif, vous pouvez utiliser certains des
mêmes validateurs intégrés cette fois, sous la forme d'une fonction. Voir ci-dessous :Validators.required
et Validators.minLength(4)
et un validateur personnalisé, forbiddenNameValidator
.getter
. Dans un formulaire réactif, vous pouvez toujours accéder à tout contrôle de formulaire via la méthode get
sur son groupe parent, mais il est parfois utile de définir des getter
en tant que raccourcis du modèle.name
getter défini dans la classe de composant.required
est toujours présent. Bien que cela ne soit pas nécessaire à des fins de validation, vous pouvez le conserver dans votre modèle pour des raisons de style CSS ou d'accessibilité.forbiddenNameValidator
des exemples précédents de ce guide.
Voici à quoi ressemble la définition de cette fonction:
bob
", ainsi le validateur rejettera tout nom de hero
contenant "bob
".
Ailleurs, il pourrait rejeter "alice
" ou tout nom associé à l'expression régulière de configuration.forbiddenNameValidator
renvoie la fonction de validation configurée.
Cette fonction prend un objet de commande Angular et renvoie soit null
si la valeur de contrôle est valable ou un objet d'erreur de validation.
L'objet d'erreur de validation a généralement une propriété dont le nom est la clé de validation 'forbiddenName
' et dont la
valeur est un dictionnaire arbitraire de valeurs que vous pouvez insérer dans un message d'erreur {name}
.null
ou un objet d'erreur de validation.
Dans le cas d'un observable, celui-ci doit être complété, le formulaire utilise alors la dernière valeur émise pour validation.FormControl
.
FormControl
, vous ne pouvez donc pas transmettre le validateur
comme vous le pouvez pour les formulaires réactifs. Au lieu de cela, vous devez ajouter une directive au modèle.ForbiddenValidatorDirective
sert de wrapper
autour du forbiddenNameValidator
.NG_VALIDATORS
,
un fournisseur avec une collection extensible de validateurs.Validator
, de sorte qu'elle puisse facilement s'intégrer aux formes Angular.
Voici le reste de la directive pour vous aider à avoir une idée de la façon dont tout cela se passe :ForbiddenValidatorDirective
est prêt, vous pouvez simplement ajouter son sélecteur appForbiddenName
,
à n'importe quel élément d'entrée pour l'activer. Par exemple:useExisting
plutôt que useClass
.
Le validateur inscrit doit être cette instance de ForbiddenValidatorDirective
, l'instance du formulaire avec sa propriété
forbiddenName
liée à "bob
". Si vous deviez remplacer useExisting
par useClass
, vous enregistrez une nouvelle instance de classe, qui ne possède pas forbiddenName
.
.ng-valid
.ng-invalid
.ng-pending
.ng-pristine
.ng-dirty
.ng-untouched
.ng-touched
hero
utilise les classes .ng-valid
et .ng-invalid pour définir la couleur de la bordure de chaque contrôle de formulaire.name
et alterEgo
sont des contrôles frères.
Pour évaluer les deux contrôles dans un seul validateur personnalisé,
nous devons effectuer la validation dans un contrôle ancêtre commun: le FormGroup
.
De cette façon, nous pouvons interroger les contrôles FormGroup
enfants pour nous permettre de comparer leurs valeurs.FormGroup
, passez le nouveau validateur comme deuxième argument lors de la création.ValidatorFn
.
Il prend un objet de contrôle Angular en tant qu'argument et renvoie null
si le formulaire est valide ou autrement ValidationErrors
.get()
du FormGroups
.
Ensuite, nous comparons simplement les valeurs des contrôles name
et alterEgo
.null
en toute sécurité.
Sinon, l'identité du héros est révélée et nous devons marquer le formulaire comme invalide en renvoyant un objet d'erreur.FormGroup
a l'erreur de validation croisée renvoyée par le validateur identityRevealed
,NG_VALIDATORS
.
Si vous ne savez pas pourquoi ou si vous ne comprenez pas bien la syntaxe, consultez la section précédente.identityRevealed
,ValidatorFn
et Validator
,
les validateurs asynchrones ont leurs propres contreparties: AsyncValidatorFn
et AsyncValidator
.first
, last
, take
, ou takeUntil
.
Il est important de noter que la validation asynchrone a lieu après la validation synchrone et qu'elle est effectuée uniquement
si la validation synchrone est réussie. Cette vérification permet aux formulaires d'éviter des processus de validation asynchrone
potentiellement coûteux, tels qu'une demande HTTP, si plusieurs méthodes de validation élémentaires échouent.pending
.
Vous pouvez inspecter la propriété pending
du contrôle et l'utiliser pour donner un retour visuel sur la validation en cours.UniqueAlterEgoValidator
implémente l'interface AsyncValidator
.
Dans le constructeur, nous injectons le HeroesService
qui a l'interface suivante :HeroesService
est chargé d'envoyer une requête HTTP
à la base de données Hero pour vérifier si l'AlterEgo est disponible.
Du point de vue du validateur, l'implémentation réelle du service n'est pas importante, nous pouvons donc simplement coder par rapport à HeroesServiceinterface
.isAlterEgoTaken()
distribue une requête HTTP
qui vérifie si l'AlterEgo est disponible et renvoie Observable ‹boolean›
le résultat.
Nous transmettons la réponse à travers l'opérateur map
et la transformons en un résultat de validation.
Comme toujours, nous retournons null
si le formulaire est valide et ValidationErrors s'il ne l'est pas.
Nous nous assurons de gérer les éventuelles erreurs avec l'opérateur catchError
.isAlterEgoTaken()
est traitée comme une validation réussie, car le fait de ne pas faire de demande de validation ne
signifie pas nécessairement que l'AlterEgo est invalide. Vous pouvez gérer l'erreur différemment et renvoyer l'objet ValidationError
à la place.pending
est défini sur falseet la
validité du formulaire est mise à jour.updateOn
de change (valeur par défaut) en submit
ou blur
.