angularjs – 等待$asyncValidators提交表单

前端之家收集整理的这篇文章主要介绍了angularjs – 等待$asyncValidators提交表单前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个具有用户名字段和其他字段的表单,此字段有一个异步验证器,用于在您尝试提交表单时检查该用户名是否可用(表单上的其他字段使用异步验证).我使用此指令验证并提交表单(仅当它有效时):

<form validation-submit="submit()"></form>
app.directive('validationSubmit',['$parse',function($parse) {
    return {
        restrict: 'A',require: '?form',compile: function($element,attr) {
            var submitFn = $parse(attr.validationSubmit);

            return function link(scope,element,attrs,FormController) {
                var submit = function(event) {
                    scope.$apply(function() {
                        if (! FormController.$valid) {
                            return;
                        }

                        submitFn(scope,{$event: event}));
                    });
                };

                element.bind('submit',submit);

                scope.$on('$destroy',function() {
                    return element.off('submit',submit);
                });
            }
        }
    };
}]);

问题是该指令不等待挂起的异步验证完成.如何将此指令更改为仅在完成并传递所有异步验证后提交?

解决方法

最近我创建了一些指令,检查电子邮件或电话号码是否可用.我找到了帮助我的解决方案.这是 $asyncValidators.

app.directive('validationSubmit',link: function(scope,FormController) {
                /**
                *returns promise
                **/
                FormController.$asyncValidators.validEmail = function (modelValue) {
                    return $q(function (resolve,reject) { 
                    //Here you should make query to your server and find out wether username valid or not
                    //For example it could be:
                    $http('http://your_api_server/Available').then(function (response) {
                            if (response.data.Available) {
                                resolve();
                            } else {
                                reject();
                            }
                        },function (err) {
                            reject(err.data);
                        });  
                        });
                };
            }

    };
}]);

您应该向表单添加属性名称

<form validation-submit="submit()" name="myForm"></form>

现在您有机会在控制器中检查表单的系统属性

$scope.submit = function(){
    //Here will be your logic
    if($scope.myForm.$valid ||
       $scope.myForm.$invalid || 
       $scope.myForm.$pending ||
       $scope.myForm.$submitted){
          //do whatever you want
        }
}

猜你在找的Angularjs相关文章