Angular ajoute automatiquement la classe 'ng-invalid ' sur les champs' required'

Je construis une application angulaire pour laquelle j'ai mis en place des formulaires. J'ai quelques champs qui doivent être remplis avant la soumission. Par conséquent, j'ai ajouté 'required' sur eux:

<input type="text" class="form-control" placeholder="Test" ng-model="data.test" required>

Cependant, lorsque je lance mon application, les champs sont affichés comme 'invalid' et les classes 'ng-invalid 'et' ng-invalid-required ' avant même que le bouton de soumission ait été cliqué ou avant que l'utilisateur n'ait tapé quoi que ce soit dans les champs.

Comment puis-je m'assurer que ces 2 classes ne sont pas ajoutées immédiatement mais une fois que l'utilisateur a soumis le formulaire, ou quand il a tapé quelque chose de mal dans le champ correspondant?

28
demandé sur Nick Div 2014-03-17 01:46:34

5 réponses

Puisque les entrées sont vides et donc invalides lorsqu'elles sont instanciées, Angular ajoute correctement la classe ng-invalid.

Une règle CSS que vous pourriez essayer:

input.ng-dirty.ng-invalid {
  color: red
}

Qui indique essentiellement quand le champ a été entré à un moment donné depuis que la page a été chargée et n'a pas été réinitialisé par $scope.formName.setPristine(true) et quelque chose n'a pas encore été entré et c'est invalide alors le texte tourne red.

Autres classes utiles pour des formes Angulaires (voir entrée pour référence future )

ng-valid-maxlength - lorsque ng-maxlength passe
ng-valid-minlength - lorsque ng-minlength passe
ng-valid-pattern - lorsque ng-pattern passe
ng-dirty - lorsque le formulaire a eu quelque chose d'entrées depuis le formulaire de chargement
ng-pristine - lorsque le formulaire de saisie a rien eu inséré depuis chargé (ou qu'il a été réinitialisé via setPristine(true) sur la forme)
ng-invalid - lors de la validation échoue (required, minlength, personnalisés, etc)

De même, il y a aussi ng-invalid-<name> pour tous ces modèles et tous les modèles personnalisés créés.

61
répondu Ryan Q 2016-08-05 19:07:41

Grâce à ce post, j'utilise ce style pour supprimer la bordure rouge qui apparaît automatiquement avec bootstrap lorsqu'un champ obligatoire est affiché, mais l'utilisateur n'a pas eu la chance de saisir quoi que ce soit déjà:

input.ng-pristine.ng-invalid {
    -webkit-box-shadow: none;
    -ms-box-shadow: none;
    box-shadow:none;
}
5
répondu user2344489 2015-09-11 18:13:32

Comme les champs sont vides, ils ne sont pas valides, les classes ng-invalid et ng-invalid-required sont ajoutées correctement.

, Vous pouvez utiliser la classe ng-pristine pour vérifier si les champs ont déjà été utilisés ou non.

1
répondu Minko Gechev 2015-07-16 13:46:29

Essayez d'ajouter la classe pour la validation dynamiquement, lorsque le formulaire a été soumis ou que le champ n'est pas valide. Utilisez le nom du formulaire et ajoutez l'attribut 'name' à l'entrée. Exemple avec Bootstrap:

<div class="form-group" ng-class="{'has-error': myForm.$submitted && (myForm.username.$invalid && !myForm.username.$pristine)}">
    <label class="col-sm-2 control-label" for="username">Username*</label>
    <div class="col-sm-10 col-md-9">
        <input ng-model="data.username" id="username" name="username" type="text" class="form-control input-md" required>
    </div>
</div>

Il est également important que votre formulaire ait l'attribut ng-submit="":

<form name="myForm" ng-submit="checkSubmit()" novalidate>
 <!-- input fields here -->
 ....

  <button type="submit">Submit</button>
</form>

Vous pouvez également ajouter une fonction optionnelle pour la validation au formulaire:

//within your controller (some extras...)

$scope.checkSubmit = function () {

   if ($scope.myForm.$valid) {
        alert('All good...'); //next step!

   }
   else {
        alert('Not all fields valid! Do something...');
    }

 }

Maintenant, lorsque vous chargez votre application la classe 'a-erreur" ne sera ajouté lorsque le formulaire est soumis, ou le domaine a été touché. Plutôt:
!myForm.utilisateur.$vierges

Vous pouvez également utiliser:
myForm.utilisateur.$sale

0
répondu grindking 2016-07-26 13:02:03

La réponse acceptée est correcte.. pour mobile, vous pouvez également utiliser ceci (ng-touché plutôt ng-sale)

input.ng-invalid.ng-touched{
  border-bottom: 1px solid #e74c3c !important; 
}
-1
répondu shakirthow 2015-10-26 15:08:46