我正在尝试对电子邮件输入执行异步验证以检查是否存在。 我的指令如下:
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。 (或者它只是同步验证器 - 如果是,那么异步返回什么?)
服务器工作并返回我的真或假,但在这两种情况下我的验证都保持有效(即使它检测到电子邮件存在)
请帮助我!
答案 0 :(得分:2)
$asyncValidator
应该不返回true / false。它需要返回被拒绝或已解决的承诺。
预期执行异步验证(例如HTTP请求)的验证集合。在模型验证过程中运行时,提供的验证功能预计会返回承诺。提供承诺后,当已履行时,验证状态将设置为 true ; 拒绝时,验证状态将设置为 false 。< / p>
<强> docs 强>
所以你要做的是:
return $http.get('...')
.then(/** resolve **/)
.catch(/** reject **/);
或者,如果您的后端仅为您提供2xx
状态(某些SPA应用程序在某些情况下要求这样做),我会在您的then
处理程序中检查所述响应的数据并处理解析/拒绝延迟对象la $q.defer()
。
如:
var deferred = $q.defer();
$http.get('...').then(function (res) {
res.someCondition ? deferred.resolve('yay!') : deferred.reject('boo!');
});
return deferred.promise;