Javascript Angular JS自定义验证$asyncvalidator未定义

Javascript Angular JS自定义验证$asyncvalidator未定义,javascript,angularjs,angularjs-directive,angularjs-validation,Javascript,Angularjs,Angularjs Directive,Angularjs Validation,正在尝试将异步验证程序添加到自定义用户名验证程序。但是,它会输出错误: TypeError:无法设置未定义的属性“username” 如何定义asyncvalidator?我以为我会被NgModel控制器自动控制 angular.module('myApp.commonDirectives',['myApp.services']).directive('username',['UsernameService',function(UsernameService){ 返回{ 限制:“A”, 要求

正在尝试将异步验证程序添加到自定义用户名验证程序。但是,它会输出错误:

TypeError:无法设置未定义的属性“username”

如何定义asyncvalidator?我以为我会被NgModel控制器自动控制


angular.module('myApp.commonDirectives',['myApp.services']).directive('username',['UsernameService',function(UsernameService){
返回{
限制:“A”,
要求:“ngModel”,
范围:{
hasFocus:“=用户名”
},
链接:函数(范围、元素、属性、ctrl){
范围$watch('hasFocus',函数(hasFocus){
如果(角度已定义(hasFocus)){
//关于模糊
如果(!hasFocus){
ctrl.$validated=false;
ctrl.$asyncValidators.username=函数(值){
UsernameService.validate(值)
.then(函数(resolvedData){
如果(解析数据){
ctrl.$validated=true;
ctrl.$setValidity('检查',true);
//ctrl.$setValidity('username',true);
}
否则{
ctrl.$validated=true;
ctrl.$setValidity('检查',false);
//ctrl.$setValidity('username',false);
}
}
);
}
}
//聚焦
否则{
ctrl.$setValidity('username',true);
ctrl.$setValidity('检查',true);
}
}
});
}
}

}])
$asyncValidators
可从angularjs 1.3及以上版本获得:


你在这里所做的一切都是复制了ANgular js文档中的示例。如果可以的话,我想继续使用Restangular插件,它被抽象到UsernameService中。为什么我的代码不起作用,而上面的代码却起作用?感谢您提供的任何帮助
asyncValidators
是angular 1.3的一项新功能^。。。。
try  something like this :

angular.module('myModule').directive('usernameValidator', function($http, $q) {
    return {
        require: 'ngModel',
        link: function(scope, element, attrs, ngModel) {
            ngModel.$asyncValidators.username = function(modelValue, viewValue) {
                return $http.post('/username-check', {username: viewValue}).then(
                    function(response) {
                        if (!response.data.validUsername) {
                            return $q.reject(response.data.errorMessage);
                        }
                        return true;
                    }
                );
            };
        }
    };
});