Ich aktualisiere programmgesteuert einige Felder in meinem Formular mit einem Wert und möchte den Feldstatus auf setzen $dirty
. So etwas tun wie:
$scope.myForm.username.$dirty = true;
scheint nicht zu funktionieren.
Es gibt eine Methode $setPristine
, mit der ich den Status des Feldes zurücksetzen kann, aber es gibt keine $setDirty
Methode?
Wie macht man das?
Ich habe diesen Beitrag https://groups.google.com/forum/#!topic/angular/NQKGAFlsln4 gesehen, aber ich kann die $setDirty
Methode nicht finden . Ich verwende Angular Version 1.1.5.
$setDirty
auf Feldebene.Antworten:
Seit AngularJS 1.3.4 können Sie
$setDirty()
Felder ( Quelle ) verwenden. Für jedes fehlerhafte und als erforderlich gekennzeichnete Feld können Sie beispielsweise Folgendes tun:quelle
In Ihrem Fall ist
$scope.myForm.username.$setViewValue($scope.myForm.username.$viewValue);
dies der Trick - es macht sowohl das Formular als auch das Feld schmutzig und fügt entsprechende CSS-Klassen hinzu.Um ehrlich zu sein, habe ich diese Lösung in einem neuen Beitrag im Thema über den Link aus Ihrer Frage gefunden. Es hat perfekt für mich funktioniert, daher setze ich dies hier als eigenständige Antwort ein, um das Auffinden zu erleichtern.
BEARBEITEN:
Die obige Lösung funktioniert am besten für die Angular-Version bis 1.3.3. Ab 1.3.4 sollten Sie die neu verfügbar gemachte API-Methode
$setDirty()
von verwendenngModel.NgModelController
.quelle
$scope.myForm.myField.$pristine = false; $scope.myForm.myField.$setViewValue(...)
. Die Antwort unten, diefield.$setDirty()
in Angular 1.3.4 hinzugefügt wurde, scheint die bessere Lösung zu seinSie müssen manuell eingestellt
$dirty
auftrue
und$pristine
umfalse
für das Feld. Wenn die Klassen in Ihrer Eingabe angezeigt werden sollen, müssen Sie Klassen manuell zum Element hinzufügenng-dirty
und daraus entfernenng-pristine
. Sie können dies$setDirty()
auf Formularebene verwenden, um all dies auf dem Formular selbst zu tun, jedoch nicht auf den Formulareingaben. Formulareingaben verfügen derzeit nicht über die$setDirty()
von Ihnen erwähnten Formulareingaben .Diese Antwort kann sich in Zukunft ändern, da sie
$setDirty()
zu den Eingaben hinzugefügt werden sollte. Dies erscheint logisch.quelle
Wenn Sie Zugriff auf den NgModelController haben (Sie können nur über eine Direktive darauf zugreifen), können Sie aufrufen
quelle
Ich habe eine jsFiddle nur für Sie erstellt, die dieses Problem löst. Setzen Sie einfach $ dirty auf true, aber mit a wird
$timeout 0
es ausgeführt, nachdem DOM geladen wurde.Finden Sie es hier: JsFiddle
quelle
Das hat bei mir funktioniert
quelle
Sie können
$setDirty();
Methode verwenden. Siehe Dokumentation https://docs.angularjs.org/api/ng/type/form.FormControllerBeispiel:
quelle
Eine Hilfsfunktion für die Arbeit:
quelle
Winkel 2
Für alle, die dasselbe in Angular 2 tun möchten, ist es sehr ähnlich, abgesehen davon, dass sie das Formular in den Griff bekommen
quelle
Kleine zusätzliche Anmerkung zu @ rmags Antwort. Wenn Sie leere, aber erforderliche Felder haben, die Sie verschmutzen möchten, verwenden Sie Folgendes:
quelle
Ich bin mir nicht sicher, warum Sie versuchen, die Felder als schmutzig zu markieren, aber ich befand mich in einer ähnlichen Situation, weil ich wollte, dass Validierungsfehler angezeigt werden, wenn jemand versucht, ein ungültiges Formular einzureichen. Am Ende habe ich jQuery verwendet, um die
.ng-pristine
Klassen-Tags zu entfernen und.ng-dirty
den entsprechenden Feldern Klassen-Tags hinzuzufügen . Beispielsweise:quelle