Validation Angularjs异步验证器如何获取要显示的自定义错误消息

Validation Angularjs异步验证器如何获取要显示的自定义错误消息,validation,angularjs-directive,Validation,Angularjs Directive,我试图显示服务器上生成的错误消息,以在返回到angular异步验证程序后显示 这是我的验证器: (函数(){ var asyncValidatorTest=函数($http,$q){ 返回{ 限制:“A”, 要求:“ngModel”, 链接:功能(范围、要素、属性、ngModel){ ngModel.$asyncValidators.asyncTest=函数(modelValue,viewValue){ var userInput=modelValue | | viewValue; var me

我试图显示服务器上生成的错误消息,以在返回到angular异步验证程序后显示

这是我的验证器:

(函数(){
var asyncValidatorTest=函数($http,$q){
返回{
限制:“A”,
要求:“ngModel”,
链接:功能(范围、要素、属性、ngModel){
ngModel.$asyncValidators.asyncTest=函数(modelValue,viewValue){
var userInput=modelValue | | viewValue;
var message=attrs[asyncValidatorTest];
返回$http({
方法:“张贴”,
url:“/AngularTest/AsyncValidatorTest”,
数据:{input:userInput}
})
.然后(功能(响应){
返回true;
},功能(回应){
message=response.statusText;
返回$q.reject(response.statusText);
});
}
}
}
}
angular.module(“angularApp”).directive(“asyncValidatorTest”[“$http”,“$q”,asyncValidatorTest]);
}())
以下是html:


异步验证测试
输入值是必需的。
{{vt.serverError}}

我错过了什么?显然存在一些问题。

不清楚您在哪里设置了vt.serverError

我做了一些与你需要的相似的事情

其思想是在验证器中调用函数作为回调函数。 在这个回调中,您可以设置一条消息,然后用{vt.serverError}显示该消息

比如说

    .directive('asyncValidator', function($http, $q,$log) {
    return {
        require: 'ngModel',
        link: function(scope, element, attrs, ngModel) {
            ngModel.$asyncValidators.failed = function(modelValue, viewValue) {
                var  url =attrs['asyncValidator'];
                var  callback =attrs['asyncValidatorCallback'],
                     fail_callback=attrs['asyncValidatorFailedCallback']
                if   (url =="") {
                    $log.error('asyncValidator should show a validator url ex:async-validator="/validator/password/md5"')
                    return false;
                }
                var  use_md5= url.indexOf('md5')>-1;


            var deferred = $q.defer();



                if (!viewValue) {
                    deferred.reject('no value');
                    return  deferred.promise;
                }
                $http.post(url, {data: use_md5?md5(viewValue):viewValue})
                    .then(function(data){
                            if (typeof callback!='undefined')
                                scope.$eval(callback)
                           deferred.resolve(data);
                    })
                    .catch(function(error){
                            if (typeof fail_callback!='undefined')
                                scope.$eval(fail_callback)
                            deferred.reject(error)

                    });
            return deferred.promise;
            };
        }
    };
});

 <input type="password" autocomplete="false" class="form-control" id="password-real"
                               name="password-real" placeholder="Password" ng-model="vm.password" required
                               async-validator="/validator/password/md5"
                               async-validator-callback="vm.getChallenge()"
                               async-validator-failed-callback="vm.challenge=false"
                               ng-model-options="{debounce:500}"
                                >
指令('asyncValidator',函数($http、$q、$log){ 返回{ 要求:'ngModel', 链接:功能(范围、元素、属性、模型){ ngModel.$asyncValidators.failed=函数(modelValue,viewValue){ var url=attrs['asyncValidator']; var callback=attrs['asyncValidatorCallback'], fail\u callback=attrs['asyncValidatorFailedCallback'] 如果(url==“”){ $log.error('asyncValidator应显示验证器url ex:async validator=“/validator/password/md5”) 返回false; } var use_md5=url.indexOf('md5')>-1; var deferred=$q.deferred(); 如果(!viewValue){ 递延。拒绝(“无价值”); 回报。承诺; } $http.post(url,{data:use_md5?md5(viewValue):viewValue}) .then(功能(数据){ if(回调类型!=“未定义”) 作用域$eval(回调) 延迟。解析(数据); }) .catch(函数(错误){ if(失败的类型\u回调!=“未定义”) 作用域$eval(失败回调) 延迟。拒绝(错误) }); 回报。承诺; }; } }; });