我的$ asyncValidator无效 - Angular Javascript

时间:2015-07-22 11:41:04

标签: javascript angularjs validation angularjs-directive

我正在尝试对电子邮件输入执行异步验证以检查是否存在。 我的指令如下:

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。 (或者它只是同步验证器 - 如果是,那么异步返回什么?)

服务器工作并返回我的真或假,但在这两种情况下我的验证都保持有效(即使它检测到电子邮件存在)

请帮助我!

1 个答案:

答案 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;