Tworzę formularz rejestracyjny w Angular z trzema wejściami: email
, password
i passwordConfirm
. Mój kontroler wygląda następująco:
app.controller('SignupController', function ($scope, User) {
$scope.user = {};
$scope.signup = function() {
User.save($scope.user, function(success) {
// TODO
}, function(error) {
if (error.status === 422) {
error.data.errors.forEach(function(item) {
$scope.signupForm[item.field].$setValidity(item.error, false);
});
}
});
};
});
Co to robi jest wysłanie żądania do mojego API, gdy użytkownik wysyła formularz, aby zarejestrować się. Jeśli pojawi się odpowiedź 422
(co oznacza błędy sprawdzania poprawności), wykonuję pętlę i ustawię odpowiednie dane wejściowe jako niepoprawne na podstawie zwracanego interfejsu API.
Weźmy przykład adresu e-mail już zarejestrowanego. Pokażę błędu walidacji moim zdaniem tak:
<small class="error" ng-show="signupForm.email.$error.exists">Email address taken, please use another</small>
To wszystko działa perfekcyjnie, ale moje użytkownik jest obecnie zablokowany, ponieważ gdy próbują zmienić adres e-mail do innego, ważność ISN email
pole” t zmieniono, aby umożliwić im ponowne przesłanie formularza (wyłączam przycisk przesyłania w oparciu o ważność formularza).
Zasadniczo potrzebuję, aby właściwość sprawdzania poprawności (w tym przypadku exists
) została zresetowana do true
po zmianie modelu wejściowego przez użytkownika. Jaki jest najlepszy sposób, aby to zrobić?
Edit: Mała fal mózgowych uderzył mnie po zaksięgowaniu dodałem to do mojego kontrolera:
$scope.$watch('user.email', function() {
// Reset exists validation property back to true
$scope.signupForm.email.$setValidity('exists', true);
});
który wydaje się działać. Kiedy użytkownik zmieni wartość modelu po tym, jak wejście zostało ustawione jako niepoprawne, przywróci to ustawienie prawidłowe. Ale nie wydaje mi się to najlepszym sposobem na zrobienie tego. Ktoś wie lepiej?