angular表单验证,远程验证&&代码实现

  • 定义验证规则,验证有效性
  • 显示验证结果
  • 禁用html5自带验证,novalidate=novalidate”“
  • 用户输入后,angular会依次调用验证器进行验证,全部成功时model会变成用户输入的值
  • 不成功则保留原值,并在model上增加一个$error对象
变量名 含义
$dirty 表单中任何一项是否输入过
$pristine 表单中任何一项尚未输入过
$error 存放错误信息
$invalid 表单数据是否无效,只要有一项无效则整个表单无效
$valid 和上面相反
$name 表单的名字
$mail 表单各个输入框的Model

form错误提示

<!DOCTYPE html>
<html ng-app="zz">
    <head>
        <meta charset="UTF-8">
        <title></title>
        <link href="js/bootstrap.min.css" rel="stylesheet"/>
    </head>
    <body ng-cpntroller="formCtrl">
        <div class="container">
        <form name="userform" novalidata="novalidata">
            <div class="form-group" ng-class="{'has-success':userform.email.$valid&&userform.email.$dirty,'has-error':userform.email.$invalid&&userform.email.$dirty}">
                <label for="email">邮箱</label>
                <input  type="email" ng-minlength="3" name="email"id="email" class="form-control" ng-model="email" ng-required="true" />
                <p ng-show="userform.email.$error.required&&userform.email.$dirty">此字段必输</p>
                <p ng-show="userform.email.$error.email&&userform.email.$dirty">请输入正确的邮箱</p>
                <p ng-show="userform.email.$error.minlength&&userform.email.$dirty">不能少于3位</p>
            </div>
            <div class="form-group">
                <input type="button"  value="提交" class="btn btn-default" />
            </div>
        </form>
        </div>
        <pre>
            {{userform|json}}
        </pre>
    </body>
    <script src="js/angular.js"></script>
    <script type="text/javascript">
        angular.module('zz',[]).controller('formCtrl',function(){

        })
    </script>
</html>

编译一个模板
用$compile.他是angular提供的一个服务
form自定义提示

<!DOCTYPE html>
<html ng-app="zz">
    <head>
        <meta charset="UTF-8">
        <title></title>
        <link href="js/bootstrap.min.css" rel="stylesheet"/>
    </head>
    <body ng-cpntroller="formCtrl">
        <div class="container">
        <form name="userform" novalidata="novalidata">
            <div class="form-group" ng-class="{'has-success':userform.email.$valid&&userform.email.$dirty,'has-error':userform.email.$invalid&&userform.email.$dirty}">
                <label for="email">邮箱</label>
                <input zz-errors type="email" ng-minlength="3" name="email"id="email" class="form-control" ng-model="email" ng-required="true" />
                <!--<p class="help-block" ng-show="userform.email.$error.required&&userform.email.$dirty">此字段必输</p>
                <p ng-show="userform.email.$error.email&&userform.email.$dirty">请输入正确的邮箱</p>
                <p ng-show="userform.email.$error.minlength&&userform.email.$dirty">不能少于3位</p>-->
            </div>
            <div class="form-group">
                <input type="button"  value="提交" class="btn btn-default" />
            </div>
        </form>
        </div>
        <pre>
            {{userform|json}}
        </pre>
    </body>
    <script src="js/angular.js"></script>
    <script type="text/javascript">
        angular.module('zz',[]).controller('formCtrl',function(){

        }).directive('zzErrors',function($compile){
            return{
                require:'ngModel',
                link:function(scope,element,attrs,ngModelCtrl){
                    var subScope=scope.$new(true);//独立的scope
                    subScope.hasErrors=function(){
                        return ngModelCtrl.$invalid;
                    }
                    subScope.errors=function(){
                        return ngModelCtrl.$error;
                    }
                    var templ='<p class="help-block" ng-show="hasErrors()" ng-repeat="(key,value) in errors()">{{key}}</p>'
                var message=$compile(templ)(subScope);
                element.after(message);
                }
            }
        })
    </script>
</html>

远程验证

<!DOCTYPE html>
<html ng-app="zz">
    <head>
        <meta charset="UTF-8">
        <title></title>
        <link href="js/bootstrap.min.css" rel="stylesheet"/>
    </head>
    <body ng-cpntroller="formCtrl">
        <div class="container">
        <form name="userform" novalidata="novalidata">
            <div class="form-group" ng-class="{'has-success':userform.email.$valid&&userform.email.$dirty,'has-error':userform.email.$invalid&&userform.email.$dirty}">
                <label for="email">邮箱</label>
                <input zz-errors type="email" ng-minlength="3" name="email"id="email" class="form-control" ng-model="email" ng-required="true" />
            </div>
            <div class="form-group" ng-class="{'has-success':userform.username.$valid&&userform.username.$dirty,'has-error':userform.username.$invalid&&userform.username.$dirty}">
                <label for="username">用户名</label>
                <input zz-errors zz-unique type="username" ng-maxlength="12" name="username"id="username" class="form-control" ng-model="username" ng-required="true" />
            </div>
            <div class="form-group">
                <input type="button"  value="提交" class="btn btn-default" />
            </div>
        </form>
        </div>
        <pre>
            {{userform|json}}
        </pre>
    </body>
    <script src="js/angular.js"></script>
    <script type="text/javascript">
        angular.module('zz',[]).controller('formCtrl',function(){

        }).directive('zzErrors',function($compile){
            return{
                require:'ngModel',
                link:function(scope,element,attrs,ngModelCtrl){
                    var subScope=scope.$new(true);//独立的scope
                    subScope.hasErrors=function(){
                        return ngModelCtrl.$invalid;
                    }
                    subScope.errors=function(){
                        return ngModelCtrl.$error;
                    }
                    var templ='<p class="help-block" ng-show="hasErrors()" ng-repeat="(key,value) in errors()">{{key|errors}}</p>'
                var message=$compile(templ)(subScope);
                element.after(message);
                }
            }
        }).filter('errors',function(){
            return function(input){
                var messager={
                    'required':'必填',
                    'email':'必须是邮箱',
                    'unqiue':'已经被占用了'
                }
                return messager[input];
            }
        }).directive('zzUnique',function($http){
            //1,监听数据变化
            //2,当数据变化时到后台验证
            //3,用返回值设置字段的有效性

            return {
                require:'ngModel',
                link:function(scope,element,attrs,ngModelCtrl){
                    scope.$watch(attrs.ngModel,function(newValue,oldValue){
                        //scope[attrs.ngModel]/ngModelCtrl.modelValue
                        console.log(newValue);
                        $http({
                            method:'POST',
                            url:'http://localhost:3000/check',
                            data:{username:newValue},
                            //headers:{'Content-Type':'application/json'}
                        }).then(function(result){
                            var data=result.data;
                            ngModelCtrl.$setValidity('unique',data.unique)
                        })
                    });

                }
            }

        })
    </script>
</html>

服务http://localhost:3000/check的代码

var express=require('express');
var  app=express();
var bodyParser=require('body-parser');
app.use(bodyParser.json());
app.post('/check',function(req,res){
    res.setHeader('Access-Control-Allow-Origin','*');
        res.setHeader('Access-Control-Allow-Headers','Content-Type');
    var data=req.body;
    if(data.username=='admin'){
        res.send({unique:false});
    }else{
        res.send({unique:true});
    }
});
app.all('/check',function(req,res){
    res.setHeader('Access-Control-Allow-Origin','*');
    res.setHeader('Access-Control-Allow-Headers','Content-Type');
    res.send({});
});
app.listen(3000);

猜你喜欢

转载自blog.csdn.net/carrie_zzz/article/details/80458308
今日推荐