Angular.js définit par programmation un champ de formulaire comme étant sale

Je mets à jour certains des champs de mon formulaire avec une valeur et j’aimerais définir l’état du champ sur $dirty . Faire quelque chose comme:

$scope.myForm.username.$dirty = true; ne semble pas fonctionner.

Il y a une méthode $setPristine que je peux utiliser pour réinitialiser l’état du champ mais il n’y a pas $setDirty méthode $setDirty ?

Alors, comment peut-on s’y prendre?

J’ai vu ce post https://groups.google.com/forum/#!topic/angular/NQKGAFlsln4 mais je n’arrive pas à trouver la méthode $setDirty . J’utilise la version angular 1.1.5.

Depuis AngularJS 1.3.4, vous pouvez utiliser $setDirty() sur les champs ( source ). Par exemple, pour chaque champ avec erreur et marqué comme requirejs, vous pouvez effectuer les opérations suivantes:

 angular.forEach($scope.form.$error.required, function(field) { field.$setDirty(); }); 

Dans votre cas, $scope.myForm.username.$setViewValue($scope.myForm.username.$viewValue); fait l’affaire – cela rend la forme et le champ sales, et ajoute les classes CSS appropriées.

Pour être honnête, j’ai trouvé cette solution dans un nouveau message dans le sujet à partir du lien de votre question. Cela a parfaitement fonctionné pour moi, alors je mets ceci ici comme une réponse autonome pour la rendre plus facile à trouver.

MODIFIER:

La solution ci-dessus fonctionne mieux pour la version angular jusqu’à 1.3.3. À partir de la version 1.3.4, vous devez utiliser la méthode API nouvellement exposée $setDirty() de ngModel.NgModelController .

vous devrez définir manuellement $dirty à true et $pristine à false pour le champ. Si vous voulez que les classes apparaissent sur votre entrée, vous devrez append manuellement ng-pristine classes ng-dirty et supprimer ng-pristine 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 du formulaire, les entrées du formulaire n’ont pas actuellement $setDirty() comme vous l’avez mentionné.

Cette réponse peut changer dans le futur car ils devraient append $setDirty() aux entrées, cela semble logique.

Si vous avez access à NgModelController (vous ne pouvez y accéder qu’à partir d’une directive), vous pouvez appeler

 ngModel.$setViewValue("your new view value"); // or to keep the view value the same and just change it to dirty ngModel.$setViewValue(ngModel.$viewValue); 

Faites un jsFiddle juste pour vous qui résout ce problème. Il suffit de définir $ dirty sur true, mais avec un $timeout 0 , il s’exécute après le chargement de DOM.

Trouvez-le ici: JsFiddle

 $timeout(function () { $scope.form.uName.$dirty = true; }, 0); 

Une fonction d’aide pour faire le travail:

 function setDirtyForm(form) { angular.forEach(form.$error, function(type) { angular.forEach(type, function(field) { field.$setDirty(); }); }); return form; } 

C’est ce qui a fonctionné pour moi

 $scope.form_name.field_name.$setDirty() 

Vous pouvez utiliser $setDirty(); méthode. Voir la documentation https://docs.angularjs.org/api/ng/type/form.FormController

Exemple:

 $scope.myForm.$setDirty(); 

Angulaire 2

Pour ceux qui cherchent à faire la même chose dans Angular 2, il est très similaire, à part obtenir la main sur le formulaire.

 
Name is required

 import { Component, } from '@angular/core'; import { FormBuilder, Validators } from '@angular/common'; @Component({ selector: 'my-example-form', templateUrl: 'app/my-example-form.component.html', directives: [] }) export class MyFormComponent { myFormModel: any; constructor(private _formBuilder: FormBuilder) { this.myFormModel = this._formBuilder.group({ 'username': ['', Validators.required], 'password': ['', Validators.required] }); } onSubmit() { this.myFormModel.markAsDirty(); for (let control in this.myFormModel.controls) { this.myFormModel.controls[control].markAsDirty(); }; if (this.myFormModel.dirty && this.myFormModel.valid) { // My submit logic } } } 

Petite note supplémentaire à la réponse de @rmag. Si vous avez des champs vides mais obligatoires que vous voulez utiliser, utilisez ceci:

 $scope.myForm.username.$setViewValue($scope.myForm.username.$viewValue !== undefined ? $scope.myForm.username.$viewValue : ''); 

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 essayait de soumettre un formulaire non valide. J’ai fini par utiliser jQuery pour supprimer les balises de classe .ng-pristine et append les balises de classe .ng-dirty aux champs appropriés. Par exemple:

 $scope.submit = function() { // `formName` is the value of the `name` atsortingbute on your `form` tag if (this.formName.$invalid) { $('.ng-invalid:not("form")').each(function() { $(this).removeClass('ng-pristine').addClass('ng-dirty'); }); // the form element itself is index zero, so the first input is typically at index 1 $('.ng-invalid')[1].focus(); } }