Avec AngularJS, je peux utiliser ng-pristine
ou ng-dirty
pour détecter si l'utilisateur est entré dans le champ. Cependant, je souhaite effectuer une validation côté client uniquement après que l'utilisateur a quitté la zone de champ. En effet, lorsqu'un utilisateur saisit un champ tel que e-mail ou téléphone, il recevra toujours une erreur jusqu'à ce qu'il ait terminé de taper son e-mail complet, et ce n'est pas une expérience utilisateur optimale.
METTRE À JOUR:
Angular est désormais livré avec un événement de flou personnalisé: https://docs.angularjs.org/api/ng/directive/ngBlur
Réponses:
Angular 1.3 a maintenant ng-model-options, et vous pouvez définir l'option sur
{ 'updateOn': 'blur'}
par exemple, et vous pouvez même anti-rebond, lorsque l'utilisation est de taper trop vite, ou que vous souhaitez enregistrer quelques opérations DOM coûteuses (comme l'écriture d'un modèle à plusieurs endroits DOM et vous ne voulez pas qu'un cycle $ digest se produise à chaque touche enfoncée)https://docs.angularjs.org/guide/forms#custom-triggers et https://docs.angularjs.org/guide/forms#non-immediate-debounce-model-updates
Et rebondir
la source
ng-change
événements avant que l'utilisateur ne quitte le champ. Par exemple, dans mon cas, je demande de nouvelles données à mon API dès que le champ de saisie est valide, mais je ne veux pas afficher de message d'erreur dès qu'il est invalide - je veux le faire seulement quand c'est invalide et l'événement de flou s'est produit.1.3.0 rc-3
et il ne se déclenche paschange
avantblur
, vérifiez ceci: plnkr.co/edit/RivVU3r7xfHO1hUybqMu?p=previewÀ partir de la version 1.3.0, cela peut facilement être fait avec
$touched
, ce qui est vrai après que l'utilisateur a quitté le terrain.https://docs.angularjs.org/api/ng/type/ngModel.NgModelController
la source
updateOn: 'default'
ce qui signifie, pour les entrées, la touche vers le haut et pour les sélections, en cas de changementJ'ai résolu ce problème en développant ce que @jlmcdonald suggérait. J'ai créé une directive qui serait automatiquement appliquée à toutes les entrées et sélectionnez les éléments:
Cela ajoutera des classes à divers éléments au fur
has-focus
ethas-visited
à mesure que l'utilisateur se concentre / visite les éléments. Vous pouvez ensuite ajouter ces classes à vos règles CSS pour afficher les erreurs de validation:Cela fonctionne bien dans la mesure où les éléments obtiennent toujours des propriétés $ invalides, etc., mais le CSS peut être utilisé pour donner à l'utilisateur une meilleure expérience.
la source
formName.inputName.$dirty
. Je suggérerais de modifier la directive pour écrire un booléen similaireformName.inputName.$focused
, plutôt que d'utiliser des noms de classe pour le flou et des booléens pour la validation.J'ai réussi à le faire avec un peu de CSS assez simple. Cela nécessite que les messages d'erreur soient frères de l'entrée à laquelle ils se rapportent et qu'ils aient une classe de
error
.Après avoir satisfait à ces deux exigences, cela masquera tout message d'erreur lié à un champ de saisie ciblé, ce que je pense qu'angularjs devrait faire de toute façon. Cela ressemble à un oubli.
la source
Cela semble être implémenté en standard dans les nouvelles versions d'angular.
Les classes ng-untouched et ng-touched sont définies respectivement avant et après que l'utilisateur se soit concentré sur un élément validé.
CSS
la source
Concernant la solution de @ lambinator ... J'obtenais l' erreur suivante dans angular.js 1.2.4:
Je ne sais pas si j'ai fait quelque chose de mal ou s'il s'agit d'un changement dans Angular, mais la suppression des
scope.$apply
instructions a résolu le problème et les classes / états sont toujours mis à jour.Si vous voyez également cette erreur, essayez ce qui suit:
la source
Cela peut fonctionner pour vous d'écrire une directive personnalisée qui encapsule la méthode javascript blur () (et exécute une fonction de validation lorsqu'elle est déclenchée); il y a un problème Angular qui en a un exemple (ainsi qu'une directive générique qui peut se lier à d'autres événements non pris en charge nativement par Angular):
https://github.com/angular/angular.js/issues/1277
Si vous ne souhaitez pas emprunter cette voie, votre autre option serait de configurer $ watch sur le champ, déclenchant à nouveau la validation lorsque le champ est rempli.
la source
Pour aller plus loin sur les réponses données, vous pouvez simplifier le balisage d'entrée en utilisant des pseudo-classes CSS3 et en ne marquant que les champs visités avec une classe pour retarder l'affichage des erreurs de validation jusqu'à ce que l'utilisateur perd le focus sur le champ:
(L'exemple nécessite jQuery)
JavaScript
CSS
HTML
la source
basé sur la réponse @nicolas .. Du CSS pur devrait faire l'affaire, il affichera uniquement le message d'erreur sur le flou
CSS
la source
Voici un exemple utilisant ng-messages (disponible dans angular 1.3) et une directive personnalisée.
Le message de validation est affiché sur le flou pour la première fois que l'utilisateur quitte le champ de saisie, mais lorsqu'il corrige la valeur, le message de validation est immédiatement supprimé (et non plus sur le flou).
JavaScript
HTML
PS. N'oubliez pas de télécharger et d'inclure ngMessages dans votre module:
la source
ng-model-options dans AngularJS 1.3 (bêta à ce jour) est documenté pour prendre en charge {updateOn: 'blur'}. Pour les versions antérieures, quelque chose comme ce qui suit a fonctionné pour moi:
Avec un modèle comme celui-ci:
la source
Utiliser l'état du champ $ touched Le champ a été touché pour cela comme indiqué dans l'exemple ci-dessous.
la source
Vous pouvez définir dynamiquement la classe css has-error (en supposant que vous utilisez bootstrap) en utilisant ng-class et une propriété sur la portée du contrôleur associé:
plunkr: http://plnkr.co/edit/HYDlaTNThZE02VqXrUCH?p=info
HTML:
Manette:
la source
Si vous utilisez bootstrap 3 et lesscss, vous pouvez activer la validation du flou avec l'extrait de code less suivant:
la source
J'ai utilisé une directive. Voici le code:
Tout mon contrôle d'entrée a un élément span comme élément suivant, qui est l'endroit où mon message de validation est affiché et donc la directive en tant qu'attribut est ajoutée à chaque contrôle d'entrée.
J'ai également (facultatif) .has-focus et has-visité la classe css dans mon fichier css que vous voyez référencé dans la directive.
REMARQUE: n'oubliez pas d'ajouter 'on-blur-val' exactement de cette façon à votre contrôle d'entrée sans les apostrophes
la source
En utilisant ng-focus, vous pouvez atteindre votre objectif. vous devez fournir ng-focus dans votre champ de saisie. Et pendant que vous écrivez vos dérivés ng-show, vous devez également écrire une logique différente. Comme le code ci-dessous:
<input type="text" class="form-control" name="inputPhone" ng-model="demo.phoneNumber" required ng-focus> <div ng-show="demoForm.inputPhone.$dirty && demoForm.inputPhone.$invalid && !demoForm.inputPhone.$focused"></div>
la source
Nous pouvons utiliser les fonctions onfocus et onblur. Ce serait simple et meilleur.
Essayez ici:
http://plnkr.co/edit/NKCmyru3knQiShFZ96tp?p=preview
la source