本文示例用angularJS对form表单做输入验证,当所有值都输入正确时,则注册按钮可用。

页面:

html:

<!DOCTYPE html>
<html lang="en">
<head>
    <Meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="../../vendor/bootstrap3/css/bootstrap.css" >
    <script src="../../vendor/angular/angularjs.js"></script>
    <script src="app/index.js"></script>
</head>
<body>
<div ng-app="myApp">
    <div ng-controller="myCtrl">

        <form name="myForm" action="1.PHP" class="container form-horizontal">

            <!--用户名-->
            <div class="form-group" ng-class="{'has-error':myForm.username.$dirty && myForm.username.$invalid}">
                <label class="control-label col-sm-2">用户名</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" name="username" autocomplete="off" ng-model="data.username" ng-required="true" ng-pattern="/^[a-zA-Z]{1}/" ng-minlength="5" ng-maxlength="10" placeholder="用户名(英文字母开头 长度>=5位 <=10位)">

                    <div ng-show="myForm.username.$dirty && myForm.username.$error.pattern" class="alert alert-danger help-block">
                        用户名必须以英文字母开始
                    </div>
                    <div ng-show="myForm.username.$dirty && myForm.username.$error.minlength" class="alert alert-danger help-block">
                        用户名长度不能小于5位
                    </div>
                    <div ng-show="myForm.username.$dirty && myForm.username.$error.maxlength" class="alert alert-danger help-block">
                        用户名长度不能超过10位
                    </div>
                </div>
            </div>

            <!--密码-->
            <div class="form-group" ng-class="{'has-error':myForm.password.$dirty && myForm.password.$invalid}">
                <label class="control-label col-sm-2">密码</label>
                <div class="col-sm-10">
                    <input type="password" class="form-control" name="password" autocomplete="off"  ng-required="true"  ng-minlength="5" ng-maxlength="10"  ng-model="data.password"  placeholder="密码(长度>=5位 <=10位)">

                    <div ng-show="myForm.password.$error.maxlength" class="alert alert-danger help-block">
                        密码长度不能超过10位
                    </div>
                    <div ng-show="myForm.password.$error.minlength" class="alert alert-danger help-block">
                        密码长度不能小于5位
                    </div>
                </div>
            </div>

            <!--确认密码-->
            <div class="form-group" ng-class="{'has-error':myForm.passwordConfirm.$dirty && myForm.passwordConfirm.$invalid}">
                <label class="col-sm-2 control-label">确认密码</label>
                <div class="col-sm-10">
                    <input name="passwordConfirm" type="password" autocomplete="off"  ng-required="true"  ng-model="data.passwordConfirm"  class="form-control" placeholder="确认密码(等于密码)">

                    <div ng-show="myForm.password.$dirty && myForm.passwordConfirm.$dirty && data.password != data.passwordConfirm" class="alert alert-danger help-block">
                        密码和确认密码不一致
                    </div>
                </div>
            </div>

            <!--手机号 严格验证手机号:/^1(3|4|5|7|8)\d{9}$/   仅验证首位是1和总长度 /^1\d{10}$/ -->
            <div class="form-group" ng-class="{'has-error':myForm.mobile.$dirty && myForm.mobile.$invalid}">
                <label class="col-sm-2 control-label">手机号</label>
                <div class="col-sm-10">
                    <input name="mobile" type="text" autocomplete="off" ng-required="true"  ng-model="data.mobile" ng-pattern="/^1\d{10}$/" class="form-control" placeholder="手机号(1开头的11数字)">

                    <div ng-show="myForm.mobile.$error.pattern" class="alert alert-danger help-block">
                        手机号格式不正确
                    </div>
                </div>
            </div>

            <!-- 邮箱  type="email" -->
            <div class="form-group" ng-class="{'has-error':myForm.email.$dirty && myForm.email.$invalid}">
                <label class="col-sm-2 control-label">邮箱</label>
                <div class="col-sm-10">
                    <input name="email" type="email" autocomplete="off"  ng-required="true"  ng-model="data.email" ng-maxlength="30" class="form-control" placeholder="邮箱(格式正确 不超30位)">

                    <div ng-show="myForm.email.$error.maxlength" class="alert alert-danger help-block">
                        邮箱长度不能超过30位
                    </div>
                    <div ng-show="myForm.email.$error.email" class="alert alert-danger help-block">
                        邮箱格式不正确
                    </div>
                </div>
            </div>

            <!-- 网址: type="url" -->
            <div class="form-group" ng-class="{'has-error':myForm.blog.$dirty && myForm.blog.$invalid}">
                <label class="col-sm-2 control-label">博客网址</label>
                <div class="col-sm-10">
                    <input name="blog" type="url" autocomplete="off"  ng-required="true"  ng-model="data.blog" class="form-control" placeholder="博客网址(http(s)://开头 格式正确)">

                    <div ng-show="myForm.blog.$error.url" class="alert alert-danger help-block">
                        博客网址格式不正确
                    </div>
                </div>
            </div>

            <!-- 年龄-->
            <div class="form-group" ng-class="{'has-error':myForm.age.$dirty && myForm.age.$invalid}">
                <label class="col-sm-2 control-label">年龄</label>
                <div class="col-sm-10">
                    <input name="age" type="number" min="3" autocomplete="off" ng-maxlength="2"  ng-required="true"  ng-model="data.age"  class="form-control" placeholder="年龄(>=3的两位数字)">

                    <div ng-show="myForm.age.$error.maxlength" class="alert alert-danger help-block">
                        年龄不能超过2位数
                    </div>
                    <div ng-show="myForm.age.$error.min" class="alert alert-danger help-block">
                        年龄不能小于3
                    </div>
                </div>
            </div>

            <!-- 单选 -->
            <div class="form-group">
                <label class="col-sm-2 control-label">性别</label>
                <div class="col-sm-10">
                    <label class="radio-inline">
                        <input type="radio" name="sex" ng-required="true" ng-model="data.sex" value="1"> 男
                    </label>
                    <label class="radio-inline">
                        <input type="radio" name="sex" ng-model="data.sex" value="0"> 女
                    </label>
                </div>
            </div>

            <!-- 复选 -->
            <div class="form-group">
                <label class="col-sm-2 control-label">爱好</label>
                <div class="col-sm-10">
                    <label class="checkBox-inline" ng-repeat="hobby in hobbies">
                        <input type="checkBox" name="hobby[]" ng-checked="data.hobbies === undefined ? false : (data.hobbies.indexOf(hobby.id)!=-1)" ng-click="toggleHobbySelection(hobby.id)" value="{{hobby.id}}"> {{hobby.name}}
                    </label>
                </div>
            </div>

            <!-- 下拉框 -->
            <div class="form-group">
                <label class="col-sm-2 control-label">出生地</label>
                <div class="col-sm-3">
                   <select class="form-control" ng-model="data.province" ng-options="x.id as x.name for x in cities | cityFilter : 0 " ></select>
                </div>
                <div class="col-sm-3">
                    <select class="form-control" ng-show="data.province" ng-model="data.city" ng-options="x.id as x.name for x in cities | cityFilter : data.province " ></select>
                </div>
                <div class="col-sm-3">
                    <select name="area" class="form-control" ng-show="data.province && data.city" ng-model="data.area" ng-required="true" ng-options="x.id as x.name for x in cities | cityFilter : data.city " ></select>
                </div>
            </div>

            <!-- 自定义表单错误验证 -->
            <div class="form-group" ng-class="{'has-error':myForm.even1.$dirty && myForm.even1.$invalid}">
                <label class="col-sm-2 control-label">请输入偶数</label>
                <div class="col-sm-10">
                    <input type="number" name="even1" class="form-control" placeholder="偶数" ng-model="data.myeven" even>
                    <div ng-show="myForm.even1.$error.even" class="alert alert-danger help-block">
                        数字必须是偶数
                    </div>
                </div>
            </div>

            <!-- 自定义控件 -->
            <div class="form-group">
                <label class="control-label col-sm-2">个人介绍</label>
                <div class="col-sm-10">
                    <custom-text-area ng-model="data.introduce"></custom-text-area>
                </div>
            </div>

            <!-- 提交和重置 -->
            <div class="form-group">
                <div class="col-sm-offset-2 col-sm-10">
                    <button type="submit" class="btn btn-default" ng-disabled="myForm.$invalid || data.hobbies === undefined || data.hobbies.length==0">注册</button>
                    <buttom type="reset" class="btn btn-default" ng-click="reset()">重置</buttom>
                </div>
            </div>

        </form>
    </div>
</div>
</body>
</html>
js:
angular.module('myApp',[])
    //自定义过滤器 用于省市区下拉框的联动
    .filter('cityFilter',function(){
        return function (data,parent){
            var filterData=[];
            angular.forEach(data,function(obj){
                if(obj.parent === parent){
                    filterData.push(obj);
                }
            });
            return filterData;
        }
    })

    //自定义表单错误验证 指令even
    .directive('even',function(){
        return {
            require:'ngModel',link:function(scope,ele,attrs,ngModelController){

                //$parsers view到model要执行的函数数组
                ngModelController.$parsers.push(function(viewValue){
                    if(viewValue %2 == 0){
                        ngModelController.$setValidity('even',true);
                    }else{
                        ngModelController.$setValidity('even',false);
                    }
                    console.log('view到model');
                    return viewValue;
                });

                //$formatters model到view要执行的函数数组
                ngModelController.$formatters.push(function(modelValue){
                    console.log('model到view');
                    return modelValue * 100 ;
                });
            }
        }
    })

    //自定义表单控件 指令custom-text-area
    .directive('customTextArea',function(){
        return{
            restrict:'E',template:'<div style="border:1px solid #bbb;line-height:38px;" contenteditable="true" ></div>',replace:true,require:'ngModel',ngModelController){
                ele.on('keyup',function(){
                    scope.$apply(function(){
                        ngModelController.$setViewValue(ele.html()); // view->model
                    });
                });

                ngModelController.$render=function(){
                    ele.html(ngModelController.$viewValue);         // model->view
                }

            }
        }
    })

    .controller('myCtrl',['$scope',function($scope){
        var that =this; //当前环境上下文

        //字典数据
        $scope.cities=[
            {name:'上海',parent:0,id:1},{name:'上海市',parent:1,id:2},{name:'徐汇区',parent:2,id:3},{name:'北京',id:4},{name:'北京市',parent:4,id:5},{name:'东城区',parent:5,id:6},{name:'西城区',id:7},{name:'昌平区',id:8},{name:'浙江',id:9},{name:'宁波',parent:9,id:10},{name:'杭州',id:11},{name:'宁波一区',parent:10,id:12},{name:'宁波二区',id:13}
        ];
        this.findParentId=function(id){
            var parentId=0;
            angular.forEach($scope.cities,function(city){
                if(city.id == id){
                    parentId=city.parent;
                    return;
                }
            });
            return parentId;
        };

        $scope.hobbies=[
            {id:1,name:'玩游戏'},{id:2,name:'写代码'},{id:3,name:'唱歌'}
        ];

        //表单中默认的用户数据
        $scope.data={
            hobbies:[2],area:8
        };
        //先保留一份默认值
        $scope.origData=angular.copy($scope.data);

        //重置事件
        $scope.reset=function(){
            $scope.data=angular.copy($scope.origData);
            $scope.myForm.$setPristine();//表单恢复原值
            that.initCity();
        };


        //显示省市区
        this.initCity=function(){
            $scope.data.city=this.findParentId($scope.data.area);
            $scope.data.province=this.findParentId($scope.data.city);
        };
        //网页刚刚打开执行
        this.initCity.call(this);

        //选择/取消爱好多选框 改变对应的model
        $scope.toggleHobbySelection=function(hobbyId){
            var index=-1;
            if($scope.data.hobbies === undefined){
                $scope.data.hobbies=[];
            }else {
                index=$scope.data.hobbies.indexOf(hobbyId);
            }

            if(index === -1){
                $scope.data.hobbies.push(hobbyId);
            }else{
                $scope.data.hobbies.splice(index,1);
            }
            console.log($scope.data.hobbies);
        };

    }]);



表单输入不正确时:

全部输入正确时:



知识点:



angularJS form表单验证的更多相关文章

  1. HTML5新增form控件和表单属性实例代码详解

    这篇文章主要介绍了HTML5新增form控件和表单属性实例代码详解,需要的朋友可以参考下

  2. HTML5表单验证特性(知识点小结)

    这篇文章主要介绍了HTML5表单验证特性的一些知识点,本文通过实例代码截图的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. amazeui页面分析之登录页面的示例代码

    这篇文章主要介绍了amazeui页面分析之登录页面的示例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  4. ios – Swift Eureka Form中的循环

    我正在构建一个Eureka表单,并希望在表单中放置一个循环来构建基于数组的步进器列表.我试图使用的代码是:但是,当我这样做时,我在StepperRow行上出现了一个错误:所以看起来Swift不再认为它在形式之内并且正在关注

  5. swift 上传图片和参数 upload image with params

    Alamofire.upload(urlRequest.0,urlRequest.1).progress{(bytesWritten,totalBytesWritten,totalBytesExpectedToWrite)inprintln("\(totalBytesWritten)/\(totalBytesExpectedToWrite)")}}

  6. swift – 使用PostgreSQL在Vapor 3中上传图片

    我正在关注这些家伙MartinLasek教程,现在我正在“图片上传”.似乎没有人能回答“如何上传iVapor3图像”的问题Db连接正常,所有其他值都保存.这是我的创建方法:和型号:}和叶子模板:我知道需要一种管理文件的方法和原始图像字节,但我怎么去那里?这使用多部分表单的自动解码:upload.leaf文件是:使用File类型可以访问上载文件的本地文件名以及文件数据.如果将其余的Question字段添加到ExampleUpload结构中,则可以使用该路径捕获整个表单的字段.

  7. Android Studio是否支持用于Android UI设计的AngularJS?

    我对AndroidStudio有疑问:AS在设计XML文件时是否支持AngularJS代码,例如:对于小动画或效果?

  8. android – 如何使用ClientID和ClientSecret在Phonegap中使用Angularjs登录Google OAuth2

    我正尝试使用Angularjs(使用IonicFramework)通过GoogleOAuth2从我的Phonegap应用程序登录.目前我正在使用http://phonegap-tips.com/articles/google-api-oauth-with-phonegaps-inappbrowser.html进行登录.但是当我使用Angular-UI-RouterforIonic时,它正在创建非常

  9. 利用require.js与angular搭建spa应用的方法实例

    这篇文章主要给大家介绍了关于利用require.js与angular搭建spa应用的方法实例,文中通过示例代码给大家介绍的非常详细,对大家的理解和学习具有一定的参考学习价值,需要的朋友们下面跟着小编来一起看看吧。

  10. 详解Angular动态组件

    本文主要介绍了Angular动态组件,对此感兴趣的同学,可以亲自实验一下。

随机推荐

  1. Angular2 innerHtml删除样式

    我正在使用innerHtml并在我的cms中设置html,响应似乎没问题,如果我这样打印:{{poi.content}}它给了我正确的内容:``但是当我使用[innerHtml]=“poi.content”时,它会给我这个html:当我使用[innerHtml]时,有谁知道为什么它会剥离我的样式Angular2清理动态添加的HTML,样式,……

  2. 为Angular根组件/模块指定@Input()参数

    我有3个根组件,由根AppModule引导.你如何为其中一个组件指定@input()参数?也不由AppModalComponent获取:它是未定义的.据我所知,你不能将@input()传递给bootstraped组件.但您可以使用其他方法来做到这一点–将值作为属性传递.index.html:app.component.ts:

  3. angular-ui-bootstrap – 如何为angular ui-bootstrap tabs指令指定href参数

    我正在使用角度ui-bootstrap库,但我不知道如何为每个选项卡指定自定义href.在角度ui-bootstrap文档中,指定了一个可选参数select(),但我不知道如何使用它来自定义每个选项卡的链接另一种重新定义问题的方法是如何使用带有角度ui-bootstrap选项卡的路由我希望现在还不算太晚,但我今天遇到了同样的问题.你可以通过以下方式实现:1)在控制器中定义选项卡href:2)声明一个函数来改变控制器中的散列:3)使用以下标记:我不确定这是否是最好的方法,我很乐意听取别人的意见.

  4. 离子框架 – 标签内部的ng-click不起作用

    >为什么标签标签内的按钮不起作用?>但是标签外的按钮(登陆)工作正常,为什么?>请帮我解决这个问题.我需要在点击时做出回复按钮workingdemo解决方案就是不要为物品使用标签.而只是使用divHTML

  5. Angular 2:将值传递给路由数据解析

    我正在尝试编写一个DataResolver服务,允许Angular2路由器在初始化组件之前预加载数据.解析器需要调用不同的API端点来获取适合于正在加载的路由的数据.我正在构建一个通用解析器,而不是为我的许多组件中的每个组件设置一个解析器.因此,我想在路由定义中传递指向正确端点的自定义输入.例如,考虑以下路线:app.routes.ts在第一个实例中,解析器需要调用/path/to/resourc

  6. angularjs – 解释ngModel管道,解析器,格式化程序,viewChangeListeners和$watchers的顺序

    换句话说:如果在模型更新之前触发了“ng-change”,我可以理解,但是我很难理解在更新模型之后以及在完成填充更改之前触发函数绑定属性.如果您读到这里:祝贺并感谢您的耐心等待!

  7. 角度5模板形式检测形式有效性状态的变化

    为了拥有一个可以监听其包含的表单的有效性状态的变化的组件并执行某些组件的方法,是reactiveforms的方法吗?

  8. Angular 2 CSV文件下载

    我在springboot应用程序中有我的后端,从那里我返回一个.csv文件WheniamhittingtheURLinbrowsercsvfileisgettingdownloaded.现在我试图从我的角度2应用程序中点击此URL,代码是这样的:零件:服务:我正在下载文件,但它像ActuallyitshouldbeBook.csv请指导我缺少的东西.有一种解决方法,但您需要创建一个页面上的元

  9. angularjs – Angular UI-Grid:过滤后如何获取总项数

    提前致谢:)你应该避免使用jQuery并与API进行交互.首先需要在网格创建事件中保存对API的引用.您应该已经知道总行数.您可以使用以下命令获取可见/已过滤行数:要么您可以使用以下命令获取所选行的数量:

  10. angularjs – 迁移gulp进程以包含typescript

    或者我应该使用tsc作为我的主要构建工具,让它解决依赖关系,创建映射文件并制作捆绑包?

返回
顶部