Мой $ asyncValidator не работает - Angular Javascript

0

Я пытаюсь выполнить асинхронную проверку на ввод электронной почты, чтобы проверить, существует ли она. Моя директива выглядит так:

app.directive('emailExist', ['$http', function ($http) {
return {
    restrict: 'A',
    require: 'ngModel',
    link: function (scope, elem, attrs, ctrl) {
        ctrl.$asyncValidators.emailExist = function (modelValue) {
            return $http({
                method: 'POST',
                url: '\email-existance',
                data: {
                    email: modelValue
                }
            }).then(function(res) {
                console.log(res)
                return (res === 'exist') ? false : true ;
            });
        }
    }
};
}]);

Насколько я понимаю, asyncvalidators должны возвращать true или false на основе проверки. (или это только проверки валидатора), и если да, то что возвращает асинкс?)

Сервер работает и возвращает мне true или false для существования, но в обоих случаях моя проверка остается действительной (даже если она обнаруживает, что письмо существует)

Пожалуйста, помогите мне!

Теги:
validation
angularjs-directive

1 ответ

1
Лучший ответ

$asyncValidator не должен возвращать true/false. Он должен вернуть отклоненное или разрешенное обещание.

Набор проверок, которые, как ожидается, будут выполнять асинхронную проверку (например, HTTP-запрос). Ожидается, что функция проверки достоверности вернет обещание, когда она будет запущена во время процесса проверки модели. После того, как обещание будет доставлено, статус проверки будет установлен на значение true, когда он будет выполнен, и false, если отклонено.

документы

Итак, что бы вы сделали:

return $http.get('...')
            .then(/** resolve **/)
            .catch(/** reject **/);

Или, если ваш бэкенд обслуживает только 2xx статусы (некоторые приложения SPA требуют, чтобы это было правдой в некоторых случаях), я бы проверял данные указанного ответа в вашем обработчике then и обрабатывал разрешение/отклонение на отложенном объекте a la $q.defer().

Такие как:

var deferred = $q.defer();

$http.get('...').then(function (res) {
  res.someCondition ? deferred.resolve('yay!') : deferred.reject('boo!');
});

return deferred.promise;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню