J'ai un formulaire avec des champs de saisie et une configuration de validation en ajoutant les required
attributs et autres. Mais pour certains domaines, je dois faire une validation supplémentaire. Comment puis-je «puiser» dans la validation qui FormController
contrôle?
La validation personnalisée pourrait être quelque chose comme "si ces 3 champs sont remplis, alors ce champ est obligatoire et doit être formaté d'une manière particulière".
Il y a une méthode FormController.$setValidity
mais qui ne ressemble pas à une API publique, je préfère donc ne pas l'utiliser. La création d'une directive personnalisée et son utilisation NgModelController
ressemblent à une autre option, mais exigeraient essentiellement que je crée une directive pour chaque règle de validation personnalisée, ce que je ne veux pas.
En fait, marquer un champ du contrôleur comme non valide (tout en restant FormController
synchronisé) pourrait être la chose dont j'ai besoin dans le scénario le plus simple pour faire le travail, mais je ne sais pas comment faire.
formName.$warning
.$$
précède les apis non publics, avec le fait d'$
être public. Voir stackoverflow.com/questions/19338493/…Réponses:
Modifier: ajout d'informations ci-dessous sur ngMessages (> = 1.3.X).
Messages de validation de formulaire standard (1.0.X et supérieur)
Étant donné que c'est l'un des meilleurs résultats si vous effectuez une recherche sur "Angular Form Validation" sur Google, actuellement, je veux ajouter une autre réponse à toute personne venant de là.
C'est "public", pas de soucis. Utilise le. C'est pour ça. S'il n'était pas destiné à être utilisé, les développeurs angulaires l'auraient privatisé lors d'une fermeture.
Pour effectuer une validation personnalisée, si vous ne souhaitez pas utiliser Angular-UI comme l'autre réponse suggérée, vous pouvez simplement lancer votre propre directive de validation.
Et voici un exemple d'utilisation:
Remarque: dans 1.2.X, il est probablement préférable de remplacer
ng-if
par -ng-show
dessusVoici un obligatoire lien plunker
En outre, j'ai écrit quelques entrées de blog sur ce sujet qui entrent dans un peu plus en détail:
Validation de forme angulaire
Directives de validation personnalisées
Edit: utilisation de ngMessages dans 1.3.X
Vous pouvez maintenant utiliser le module ngMessages au lieu de ngShow pour afficher vos messages d'erreur. Cela fonctionnera en fait avec n'importe quoi, ce ne doit pas être un message d'erreur, mais voici les bases:
<script src="angular-messages.js"></script>
Référence
ngMessages
dans votre déclaration de module:Ajoutez le balisage approprié:
Dans le balisage ci-dessus,
ng-message="personForm.email.$error"
spécifie essentiellement un contexte pour lesng-message
directives enfants. Ensuite,ng-message="required"
etng-message="email"
spécifiez les propriétés de ce contexte à surveiller. Plus important encore, ils spécifient également un ordre pour les enregistrer . Le premier qu'il trouve dans la liste qui est "véridique" l'emporte, et il montrera ce message et aucun des autres.Et un plongeur pour l'exemple ngMessages
la source
return value ? valid : undefined
ci - dessus.Le projet d'Angular-UI inclut une directive ui-validate, qui vous aidera probablement avec cela. Il vous permet de spécifier une fonction à appeler pour effectuer la validation.
Jetez un œil à la page de démonstration: http://angular-ui.github.com/ , recherchez la rubrique Valider.
Depuis la page de démonstration:
puis dans votre contrôleur:
la source
Vous pouvez utiliser ng-required pour votre scénario de validation ("si ces 3 champs sont remplis, alors ce champ est obligatoire":
la source
Vous pouvez utiliser Angular-Validator .
Exemple: utiliser une fonction pour valider un champ
Ensuite, dans votre contrôleur, vous auriez quelque chose comme
Vous pouvez également faire quelque chose comme ceci:
(où champ1 champ2 et champ3 sont des variables d'étendue. Vous pouvez également vérifier si les champs ne correspondent pas à la chaîne vide)
Si le champ ne
validator
réussit pas, le champ sera marqué comme invalide et l'utilisateur ne pourra pas soumettre le formulaire.Pour plus d'exemples d'utilisation et d'exemples, voir: https://github.com/turinggroup/angular-validator
Avertissement: je suis l'auteur de Angular-Validator
la source
J'ai récemment créé une directive pour permettre l'invalidation basée sur l'expression des entrées de forme angulaire. Toute expression angulaire valide peut être utilisée et prend en charge les clés de validation personnalisées à l'aide de la notation d'objet. Testé avec angulaire v1.3.8
Vous pouvez l'utiliser comme ceci:
Ou en passant simplement une expression (elle recevra la clé de validation par défaut "invalidIf")
la source
Voici une façon intéressante de faire des validations d'expressions génériques personnalisées dans un formulaire (à partir de: Validation de formulaire avancée avec AngularJS et filtres ):
Démo jsFiddle (prend en charge la dénomination des expressions et plusieurs expressions)
C'est similaire à
ui-validate
, mais vous n'avez pas besoin d'une fonction de validation spécifique à la portée (cela fonctionne de manière générique) et bien sûr, vous n'avez pas besoin de ui.utils de cette façon.la source
Mettre à jour:
Version améliorée et simplifiée de la directive précédente (une au lieu de deux) avec la même fonctionnalité:
Exemple d'utilisation:
Résultat: expressions de test mutuellement dépendantes où les validateurs sont exécutés lors du changement du modèle de directive de l'autre et du modèle actuel.
L'expression de test a une
$model
variable locale que vous devez utiliser pour la comparer à d'autres variables.Précédemment:
J'ai tenté d'améliorer le code @Plantface en ajoutant une directive supplémentaire. Cette directive supplémentaire est très utile si notre expression doit être exécutée lorsque des modifications sont apportées à plusieurs variables ngModel.
Exemple d'utilisation pour créer des champs à validation croisée:
ensure-expression
est exécuté pour valider le modèle lorsque l'uneng-model
ou l'autre desensure-watch
variables est modifiée.la source
@synergetic Je pense que @blesh suppose de mettre la fonction valider comme ci-dessous
la source
Validations personnalisées qui appellent un serveur
Utilisez l' API ngModelController
$asyncValidators
qui gère la validation asynchrone, comme faire une$http
demande au backend. Les fonctions ajoutées à l'objet doivent renvoyer une promesse qui doit être résolue lorsqu'elle est valide ou rejetée lorsqu'elle n'est pas valide. Les validations asynchrones en cours sont stockées par entrée au clavierngModelController.$pending
. Pour plus d'informations, consultez AngularJS Developer Guide - Forms (Custom Validation) .Pour plus d'informations, voir
$asyncValidators
API ngModelControllerGuide du développeur AngularJS - Formulaires (validation personnalisée) .
Utilisation de l'
$validators
APILa réponse acceptée utilise les pipelines
$parsers
et$formatters
pour ajouter un validateur synchrone personnalisé. AngularJS 1.3+ a ajouté une$validators
API donc il n'est pas nécessaire de mettre des validateurs dans les pipelines$parsers
et$formatters
:Pour plus d'informations, consultez AngularJS ngModelController API Reference - $ validators .
la source
Dans AngularJS, le meilleur endroit pour définir la validation personnalisée est la directive Cutsom. AngularJS fournit un module ngMessages.
Pour la validation du formulaire personnalisé, il faut utiliser les modules ngMessages avec une directive personnalisée.Ici, j'ai une validation simple qui vérifiera si la longueur du numéro est inférieure à 6 afficher une erreur à l'écran
Voici comment créer une directive de validation personnalisée
$setValidity
est une fonction intégrée pour définir l'état du modèle sur valide / invalidela source
J'ai étendu la réponse de @Ben Lesh avec une capacité à spécifier si la validation est sensible à la casse ou non (par défaut)
utilisation:
code:
la source
Quelques grands exemples et bibliothèques présentés dans ce fil, mais ils n'avaient pas tout à fait ce que je cherchais. Mon approche: angular-valid - une bibliothèque de validation basée sur les promesses pour la validation asynchrone, avec un style Bootstrap optionnel intégré.
Une solution à validité angulaire pour le cas d'utilisation de l'OP pourrait ressembler à ceci:
Voici un violon , si vous voulez le faire tourner. La lib est disponible sur GitHub , a une documentation détaillée et de nombreuses démos en direct.
la source