加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angularjs – 等待$asyncValidators提交表单

发布时间:2020-12-17 16:57:31 所属栏目:安全 来源:网络整理
导读:我有一个具有用户名字段和其他字段的表单,此字段有一个异步验证器,用于在您尝试提交表单时检查该用户名是否可用(表单上的其他字段使用异步验证).我使用此指令验证并提交表单(仅当它有效时): form validation-submit="submit()"/form app.directive('validat
我有一个具有用户名字段和其他字段的表单,此字段有一个异步验证器,用于在您尝试提交表单时检查该用户名是否可用(表单上的其他字段使用异步验证).我使用此指令验证并提交表单(仅当它有效时):

<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
        }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读