Je mets à jour par programme certains des champs de mon formulaire avec une valeur et je voudrais définir l'état du champ sur $dirty
. Faire quelque chose comme:
$scope.myForm.username.$dirty = true;
ne semble pas fonctionner.
Il existe une méthode $setPristine
que je peux utiliser pour réinitialiser l'état du champ mais il n'y a pas de $setDirty
méthode?
Alors, comment s'y prend-on?
J'ai vu ce post https://groups.google.com/forum/#!topic/angular/NQKGAFlsln4 mais je n'arrive pas à trouver la $setDirty
méthode. J'utilise la version Angular 1.1.5.
$setDirty
sur le terrain.Réponses:
Depuis AngularJS 1.3.4, vous pouvez utiliser
$setDirty()
sur les champs ( source ). Par exemple, pour chaque champ avec erreur et marqué comme requis, vous pouvez effectuer les opérations suivantes:la source
Dans votre cas,
$scope.myForm.username.$setViewValue($scope.myForm.username.$viewValue);
fait l'affaire - cela rend le formulaire et le champ sales et ajoute les classes CSS appropriées.Pour être honnête, j'ai trouvé cette solution dans un nouveau post dans le sujet à partir du lien de votre question. Cela a parfaitement fonctionné pour moi, donc je mets cela ici comme une réponse autonome pour faciliter la recherche.
ÉDITER:
La solution ci-dessus fonctionne mieux pour la version angulaire jusqu'à 1.3.3. À partir de la version 1.3.4, vous devez utiliser la méthode API nouvellement exposée
$setDirty()
dengModel.NgModelController
.la source
$scope.myForm.myField.$pristine = false; $scope.myForm.myField.$setViewValue(...)
. On dirait que la réponse ci-dessous indiquant que cela afield.$setDirty()
été ajouté dans Angular 1.3.4 sera la meilleure solutionvous devrez définir manuellement
$dirty
surtrue
et$pristine
surfalse
pour le champ. Si vous voulez que les classes apparaissent sur votre entrée, vous devrez ajouterng-dirty
et supprimer manuellement desng-pristine
classes de l'élément. Vous pouvez utiliser$setDirty()
au niveau du formulaire pour faire tout cela sur le formulaire lui-même, mais pas les entrées de formulaire, les entrées de formulaire n'ont pas actuellement$setDirty()
comme vous l'avez mentionné.Cette réponse peut changer dans le futur car ils devraient s'ajouter
$setDirty()
aux entrées, semble logique.la source
Si vous avez accès au NgModelController (vous ne pouvez y accéder qu'à partir d'une directive), vous pouvez appeler
la source
Faites un jsFiddle juste pour vous qui résout ce problème. définissez simplement $ dirty sur true, mais avec un
$timeout 0
so il s'exécute après le chargement du DOM.Trouvez-le ici: JsFiddle
la source
C'est ce qui a fonctionné pour moi
la source
Vous pouvez utiliser la
$setDirty();
méthode. Voir la documentation https://docs.angularjs.org/api/ng/type/form.FormControllerExemple:
la source
Une fonction d'assistance pour faire le travail:
la source
Angulaire 2
Pour tous ceux qui cherchent à faire la même chose dans Angular 2, c'est très similaire, mis à part la prise en main du formulaire
la source
Petite note supplémentaire à la réponse de @ rmag. Si vous avez des champs vides mais obligatoires que vous souhaitez modifier, utilisez ceci:
la source
Je ne sais pas exactement pourquoi vous essayez de marquer les champs comme sales, mais je me suis retrouvé dans une situation similaire parce que je voulais que des erreurs de validation apparaissent lorsque quelqu'un a tenté de soumettre un formulaire invalide. J'ai fini par utiliser jQuery pour supprimer les
.ng-pristine
balises de classe et ajouter.ng-dirty
des balises de classe aux champs appropriés. Par exemple:la source