2013-05-26 12 views
68

Próbowałem zresetować formularz po przesłaniu formularza. Ktoś opublikował tę wiadomość: Here, którą chcę sprawić, żeby działała, ale bez powodzenia. Oto mój My Code Example.

$scope.form.$setPristine(); nie ustawia Pristine: {{user_form.$pristine}} na true. Zobacz przykład powyżej.

+0

Patrząc na twój kod, myślę, że część problemu polega na tym, że data.name jest usuwana z regularnego, kanciastego sposobu. Co jeśli deklarujesz dane w swoim modelu i faktycznie używasz $ scope.data.name = '' w metodzie resetowania. W przeciwnym razie możesz spróbować $ scope.apply(); Myślę, że model jest nadal brudny i dlatego nie działa. –

Odpowiedz

86

$ setPristine() został wprowadzony w gałęzi angularjs 1.1.x. Aby to działało, musisz użyć tej wersji zamiast wersji 1.0.7.

Zobacz http://plnkr.co/edit/815Bml?p=preview

+0

Masz rację. Jedno pytanie. Kiedy zostanie to dodane do wersji stabilnej. jakiś pomysł czy będzie użyty w gałęzi 1.0.x? 1.1.5 nie jest stabilny. – Pirzada

+0

Nie jestem pewien, kiedy będą stabilne 1.1.x. –

+0

@Rashid Angular 1.2 będzie następną stabilną wersją (kiedykolwiek zostanie wydana). Wszystkie wersje 1.1.x podlegają zmianom API, ale będziesz musiał radzić sobie z tymi samymi zmianami, mimo że przechodzisz z wersji 1.0.x do wersji 1.2.x. –

11

tylko dla tych, którzy chcą dostać $setPristine bez konieczności uaktualnienia do V1.1.x, tutaj jest funkcja Kiedyś symulować funkcję $setPristine. Nie chciałem korzystać z wersji 1.5, ponieważ jeden z używanych przeze mnie komponentów AngularUI nie jest zgodny.

 var setPristine = function(form){ 
      if(form.$setPristine){//only supported from v1.1.x 
       form.$setPristine(); 
      }else{ 

       /* 
       *Underscore looping form properties, you can use for loop too like: 
       *for(var i in form){ 
       * var input = form[i]; ... 
       */ 
       _.each(form, function (input) 
       { 
        if (input.$dirty) { 
         input.$dirty = false; 
        } 
       }); 
      } 
     }; 

Należy pamiętać, że to tylko sprawia $dirty pola czyste i pomóc zmieniając „Pokaż błędzie” stan jak $scope.myForm.myField.$dirty && $scope.myForm.myField.$invalid.

Inne części obiektu formularza (takie jak klasy css) muszą jeszcze rozważyć, ale to rozwiąże mój problem: ukryj komunikaty o błędach.

4

I rozwiązać ten sam problem konieczności resetowania formę w stanie dziewiczym w wersji 1.0.7 kątowe (żadna metoda $ setPristine)

W moim przypadku użytkowania, formy, po napełnieniu i składać musi zniknąć dopóki nie będzie konieczne ponowne wypełnienie innego rekordu. Stworzyłem efekt show/hide, używając ng-switch zamiast ng-show. Jak podejrzewałem, przy pomocy ng-switch, podformularz DOM formy został całkowicie usunięty, a następnie odtworzony. Więc nieskazitelny stan jest automatycznie przywracany.

Podoba mi się, ponieważ jest prosty i czysty, ale może nie być odpowiedni dla nikogo.

może to również sugerować pewne problemy z wydajnością w przypadku dużych formularzy (?) W mojej sytuacji nie spotkałem się jeszcze z tym problemem.

6

DavidLn's answer działa dobrze dla mnie w przeszłości. Ale to nie przechwytuje całej funkcjonalności setPristine, która tym razem mnie zaskoczyła. Oto podkładka pełniejsze:

var form_set_pristine = function(form){ 
    // 2013-12-20 DF TODO: remove this function on Angular 1.1.x+ upgrade 
    // function is included natively 

    if(form.$setPristine){ 
     form.$setPristine(); 
    } else { 
     form.$pristine = true; 
     form.$dirty = false; 
     angular.forEach(form, function (input, key) { 
      if (input.$pristine) 
       input.$pristine = true; 
      if (input.$dirty) { 
       input.$dirty = false; 
      } 
     }); 
    } 
}; 
6

Nie ma innego sposobu na dziewiczych formularz który jest poprzez wysłanie formularza do kontrolera. Na przykład: -

W świetle: -

<form name="myForm" ng-submit="addUser(myForm)" novalidate> 
    <input type="text" ng-mode="user.name"/> 
    <span style="color:red" ng-show="myForm.name.$dirty && myForm.name.$invalid"> 
     <span ng-show="myForm.name.$error.required">Name is required.</span> 
    </span> 

    <button ng-disabled="myForm.$invalid">Add User</button> 
</form> 

kontrolera: -

$scope.addUser = function(myForm) { 
     myForm.$setPristine(); 
}; 
8

miał podobny problem, gdzie musiałem ustawić formę z powrotem do nietknięta, ale także nietknięte, ponieważ $ invalid i $ error były używane do pokazywania komunikatów o błędach. Tylko użycie metody setPristine() nie wystarczyło, aby usunąć komunikaty o błędach.

Rozwiązałem go, używając setPristine() i setNieutkniętego(). (patrz dokumentacja kątowej za: https://docs.angularjs.org/api/ng/type/ngModel.NgModelController)

Tak, w moim kontrolera, użyłem:

$scope.form.setPristine(); 
$scope.form.setUntouched(); 

Te dwie funkcje przywrócić pełną formę do $ dziewiczy iz powrotem do $ nietknięte, tak aby wszystkie komunikaty o błędach były wyczyszczone.

+3

Dzięki za informacje. W moim przypadku była to forma. $ SetPristine() i formularz. $ SetUntouch(). –

Powiązane problemy