Я пытаюсь выполнить асинхронную проверку на ввод электронной почты, чтобы проверить, существует ли она. Моя директива выглядит так:
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 для существования, но в обоих случаях моя проверка остается действительной (даже если она обнаруживает, что письмо существует)
Пожалуйста, помогите мне!
$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;