【问题标题】:Angular JS custom validation $asyncvalidator is undefinedAngular JS 自定义验证 $asyncvalidator 未定义
【发布时间】:2014-11-17 15:36:40
【问题描述】:

尝试将 asyncvalidator 添加到我的自定义用户名验证器。但是它输出错误:

TypeError: 无法设置未定义的属性“用户名”。

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

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
angular.module('myApp.commonDirectives', ['myApp.services']).directive('username', ['UsernameService',function(UsernameService){
	
	return {
		
	    restrict: 'A',
	    require: "ngModel",
	    scope: {
	        hasFocus: "=username"
	        
	    },
	    link: function(scope, element, attrs, ctrl) {
	    
	        scope.$watch('hasFocus', function(hasFocus) {
	            if(angular.isDefined(hasFocus)) {

	                // on blur
	                if(!hasFocus) {
	                    
	                  
	                    ctrl.$validated=false;
	                    ctrl.$asyncValidators.username = function(value){
	                    UsernameService.validate(value)
	                        .then(function(resolvedData) {
	                            if(resolvedData) {
	                          
	                            	ctrl.$validated=true;
	                                ctrl.$setValidity('checking', true);
//	                                ctrl.$setValidity('username', true);
	                            }
	                            else {
	                          
	                            	ctrl.$validated=true;
	                                ctrl.$setValidity('checking', false);
//	                                ctrl.$setValidity('username', false);
	                            }
	                        }
	                     );
	                }
	                }
	                
	                // on focus
	                else {
	                    ctrl.$setValidity('username', true);
	                    ctrl.$setValidity('checking', true);
	                }
	            }
	            
	        });
	    }

	}
}])

【问题讨论】:

  • asyncValidators 是 Angular 1.3 的新功能
  • ^ 非常有用的评论....

标签: javascript angularjs angularjs-directive angularjs-validation


【解决方案1】:

$asyncValidators 可用于 angularjs 1.3 及更高版本:

https://code.angularjs.org/1.2.27/docs/api/ng/type/ngModel.NgModelController

【讨论】:

    【解决方案2】:
    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;
                        }
                    );
                };
            }
        };
    });
    

    【讨论】:

    • 您所做的一切都复制了 Angular js 文档中的示例。如果可以的话,我想继续使用 Restangular 插件,它被抽象到 UsernameService 中。为什么我的代码不起作用,而上面的代码呢?感谢您提供的任何帮助
    猜你喜欢
    • 1970-01-01
    • 2019-01-07
    • 2018-07-28
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多