Programowo aktualizuję niektóre pola w moim formularzu za pomocą wartości i chcę ustawić stan pola na $dirty
. Robię coś takiego:
$scope.myForm.username.$dirty = true;
nie wydaje się działać.
Istnieje metoda $setPristine
, której mogę użyć, aby zresetować stan pola, ale nie ma $setDirty
metody?
Jak więc można to zrobić?
Widziałem ten post https://groups.google.com/forum/#!topic/angular/NQKGAFlsln4, ale nie mogę znaleźć $setDirty
metody. Używam Angular w wersji 1.1.5.
$setDirty
na poziomie pola.Odpowiedzi:
Od AngularJS 1.3.4 możesz używać
$setDirty()
na polach ( źródło ). Na przykład dla każdego pola z błędem i oznaczonym jako wymagane możesz wykonać następujące czynności:źródło
W twoim przypadku
$scope.myForm.username.$setViewValue($scope.myForm.username.$viewValue);
załatwia sprawę - brudzi zarówno formularz, jak i pole oraz dołącza odpowiednie klasy CSS.Szczerze mówiąc to rozwiązanie znalazłem w nowym poście w temacie z linku z Twojego pytania. U mnie zadziałało idealnie, więc umieszczam to tutaj jako samodzielną odpowiedź, aby łatwiej ją znaleźć.
EDYTOWAĆ:
Powyższe rozwiązanie działa najlepiej dla wersji Angular do 1.3.3. Począwszy od wersji 1.3.4, powinieneś użyć nowo ujawnionej metody API
$setDirty()
zngModel.NgModelController
.źródło
$scope.myForm.myField.$pristine = false; $scope.myForm.myField.$setViewValue(...)
. Wygląda na to, że odpowiedź poniżej stwierdzająca, żefield.$setDirty()
została dodana w Angular 1.3.4 będzie lepszym rozwiązaniemtrzeba będzie ustawić ręcznie
$dirty
, abytrue
i$pristine
nafalse
na polu. Jeśli chcesz, aby klasy pojawiały się na twoim wejściu, będziesz musiał ręcznie dodawaćng-dirty
i usuwaćng-pristine
klasy z elementu. Możesz użyć$setDirty()
na poziomie formularza, aby zrobić to wszystko w samym formularzu, ale nie na danych wejściowych formularza, których obecnie nie ma,$setDirty()
jak wspomniałeś.Ta odpowiedź może się zmienić w przyszłości, ponieważ powinny one dodawać
$setDirty()
do danych wejściowych, wydaje się logiczne.źródło
Jeśli masz dostęp do NgModelController (możesz uzyskać do niego dostęp tylko z dyrektywy), możesz wywołać
źródło
Stworzyłem jsFiddle specjalnie dla Ciebie, które rozwiązuje ten problem. po prostu ustaw $ dirty na true, ale z
$timeout 0
tak działa po załadowaniu DOM.Znajdź to tutaj: JsFiddle
źródło
To właśnie zadziałało dla mnie
źródło
Możesz użyć
$setDirty();
metody. Zobacz dokumentację https://docs.angularjs.org/api/ng/type/form.FormControllerPrzykład:
źródło
Funkcja pomocnicza do wykonania pracy:
źródło
Kątowy 2
Dla każdego, kto chce zrobić to samo w Angular 2, jest to bardzo podobne, poza uzyskaniem formy
źródło
Mała dodatkowa uwaga do odpowiedzi @ rmag. Jeśli masz puste, ale wymagane pola, które chcesz zmienić, użyj tego:
źródło
Nie jestem pewien, dlaczego próbujesz oznaczyć pola jako brudne, ale znalazłem się w podobnej sytuacji, ponieważ chciałem, aby błędy walidacji pojawiały się, gdy ktoś próbował przesłać nieprawidłowy formularz. Skończyło się na użyciu jQuery do usunięcia
.ng-pristine
tagów klas i dodania.ng-dirty
tagów klas do odpowiednich pól. Na przykład:źródło