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

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

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 ;
            });
        }
    }
};
}]);

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

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

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


person fedesc    schedule 22.07.2015    source источник


Ответы (1)


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

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

документы

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

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

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

Такие как:

var deferred = $q.defer();

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

return deferred.promise;
person Kasper Lewau    schedule 22.07.2015