angular实现表单验证及提交功能


Posted in Javascript onFebruary 01, 2017

本例通过Angular框架来实现简单的表单验证

一、html结构

1、借助于bootstrap快速的编写了一个简单的表单
代码主要部分如下: 

<div class="container" style="margin-top: 30px;" ng-controller="myCtrl">
  <h1 style="text-align: center">用户表单提交</h1>
  <form action="upload.js" class="form-horizontal" name="myForm">
    <div class="form-group">
      <label for="username" class="col-sm-3 control-label">用户名</label>
      <div class="col-sm-9">
        <input type="text" autocomplete="false" name="username" placeholder="用户名" ng-model="data.username" id="username" class="form-control" required>
        <div class="alert alert-danger help-block" >
          用户名长度不能小于5位
        </div>
        <div class="alert alert-danger help-block" >
          用户名长度不能大于15位
        </div>
      </div>
    </div>
  </form>
 </div>

2、表单验证常见问题及指令

1)、问题:
》如何绑定数据——双向绑定
》验证表单——正则表达式
》显示错误信息
》整个Form的验证
》避免提交没通过验证的表单
》防止多次提交
2)、常用指令
》指令:
ng-model,ng-required,ng-pattern,ng-maxlength,ng-minlength,ng-change
》样式:
ng-valid,ng-invalid,ng-pristine,ng-dirty
》form控制变量
formName.inputFieldName.$error:字段错误信息
formName.inputFieldName.$dirty:字段是否修改
formName.inputFieldName.$pristine:字段是否是初始状态
formName.inputFieldName.$valid:字段是否有效
formName.inputFieldName.$invalid:字段是否无效

二、功能实现

2.1 用户名验证
用户输入用户名字段验证主要是长度验证,以及是否必须

1、ng-model绑定表单数据,以便使用angular的验证api
2、ng-minlength,ng-maxlength规定字段长段,required规定字段必填
3、错误提示信息通过formName.inputFieldName.$error.minlength/maxlength决定是否要显示,当输入不合法时,$error对应的错误信息会为true
如下:

<div class="form-group">
    <label for="username" class="col-sm-3 control-label">用户名</label>
    <div class="col-sm-9">
      <input type="text" autocomplete="false" name="username" placeholder="用户名" ng-model="data.username" id="username" ng-minlength="5" ng-maxlength="15" class="form-control" required>
      <div class="alert alert-danger help-block" ng-show="myForm.username.$error.minlength">
        用户名长度不能小于5位
      </div>
      <div class="alert alert-danger help-block" ng-show="myForm.username.$error.maxlength">
        用户名长度不能大于15位
      </div>
    </div>
  </div>

2.2 密码确认验证

用户密码确认验证需要保证两次输入的密码一致,且在未输入确认密码前不验证

1、绑定数据ng-model=data.pwdConfirm(所有表单数据都保存到data对象中)
2、通过判断data.pwdConfirm!==data.password确定两次密码是否输入一致
3、通过formName.inputField.$dirty确定此项是否填写过

<div class="form-group">
    <label class="col-sm-3 control-label">确认密码</label>
    <div class="col-sm-9">
      <input type="password" name="pwdConfirm" ng-model="data.pwdConfirm" placeholder="确认密码" id="pwdConfirm" required class="form-control">
      <div class="alert alert-danger" ng-show="data.pwdConfirm!==data.password&&myForm.pwd.$dirty">
        两次输入的密码不一致
      </div>
    </div>
  </div>

2.3 邮箱验证

邮箱验证主要验证邮箱格式是否正确,字段长度

1、使用H5中新增type属性值email作为
2、通过ng-pattern指令定义邮箱验证的正则
3、邮箱验证常用正则表达式:^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+
4、通过myForm.email.$error.pattern验证邮箱格式是否正确

<div class="form-group">
    <label class="col-sm-3 control-label">邮箱</label>
    <div class="col-sm-9">
      <input type="email" name="email" ng-model="data.email" placeholder="邮箱" class="form-control" required ng-pattern="/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/">
      <div class="alert alert-danger help-block" ng-show="myForm.email.$error.minlength">
        邮箱长度不能小于5位
      </div>
      <div class="alert alert-danger help-block" ng-show="myForm.email.$error.pattern">
        请填写正确的邮箱格式
      </div>
      <div class="alert alert-danger help-block" ng-show="myForm.email.$error.maxlength">
        邮箱长度不能大于30位
      </div>
    </div>
  </div>

2.4 单复选框

单复选框主要确定数据绑定问题,以及复选框的数据渲染
1、通过以data对象的属性形式来绑定数据
2、多选的选项值通过ng-repeat进行遍历
3、设置value值以便提交时对值进行区分

<div class="form-group">
    <label class="col-sm-3 control-label">性别</label>
     <div class="col-sm-9">
       <label class="radio-inline">
         <input type="radio" name="sex" value="1" ng-model="data.sex" />男
       </label>
       <label class="radio-inline">
         <input type="radio" name="sex" value="0" ng-model="data.sex" />女
       </label>
     </div>
  </div>
   <div class="form-group">
    <label class="col-sm-3 control-label">爱好</label>
     <div class="col-sm-9">
       <label class="radio-inline" ng-repeat="hobby in hobbies">
         <input type="checkbox" name="hobby" ng-model="hobbiesC" value="{{hobby.id}}" /> {{hobby.name}}
       </label>
     </div>
  </div>
  <div class="col-sm-9 col-sm-offset-3">
    <input type="reset" class=" btn btn-danger" value="重置">
    <input type="submit" class="btn btn-primary " value="提交">
  </div>

2.5 城市二级联动

1、城市数据定义:每个城市对象包括id,parent,name属性,id为每个城市省份独有,parent是根据父级省份或城市而定
2、通过ng-options指令来遍历出城市数据

2.5.1 城市数据模型

通过\$scope.cities定义数据模型

$scope.cities=[
    {
      id:1,
      parent:0,
      name:'四川省'
    },
    {
      id:2,
      parent:1,
      name:'成都市'
    },
    ...
  ]

2.5.2 html中渲染城市数据

通过ng-options指令和ng-model指令遍历数据和设置默认值

<div class="form-group">
    <label class="col-sm-3 control-label">出生地</label>
     <div class="col-sm-3">
       <select name="birthAddress" id="" ng-model="data.province" ng-options="c.id as c.name for c in cities">
         <option value="">-- 请选择 --</option>
       </select>
     </div>
  </div>

说明:
1、ng-options=”obj.name for obj in datas” 常见用法,通过 obj.id as obj.name设置option标签的value值为id,内容为name
2、ng-model可用于设置select的默认值
2.5.3 定义过滤器用于过滤省份,城市等

.filter("cityFilter",function(){
  return function(input,parent){
    var filtedData=[];
    angular.forEach(input,function(value,key){
      if(value.parent===parent){
        filtedData.push(value)
      }
    })
    return filtedData;
  }
})

说明:
1、如上通过定义cityFilter,传入一个parent作为参数,遍历传入的数据,并宽判断是否与传入的parent相等来确定当前城市是哪一级
2、返回的filtedData即是过滤结果。
3、用到了angular.forEach(obj,fn)迭代器,其中fn有三个参数传入,分别是value,key,obj;value即为当前遍历出的对象,key为遍历的唯一标识,obj为被遍历的数组或对象本身。
使用(省份): ng-options="c.id as c.name for c in cities|cityFilter:0"

2)、城市对应选择
1、根据data.province作为过滤参数,进行城市筛选
2、区域的选择同理,可设置当选择了城市后,再出现区域选项框(ng-show指令)

<div class="col-sm-2">
    <select name="birthC" ng-model="data.cities" ng-options="c.id as c.name for c in cities|cityFilter:data.province">
      <option value="">-- 请选择 --</option>
    </select>
  </div>
  <div class="col-sm-2" ng-show="!myForm.birthC.$pristine">
    <select name="birthD" ng-model="data.district" ng-options="c.id as c.name for c in cities|cityFilter:data.cities">
      <option value="">-- 请选择 --</option>
    </select>
  </div>

2.6 表单提交

1、功能需求:当表单验证不通过时,使提交按钮失效(ng-disabled),

html结构:

<div class="col-sm-9 col-sm-offset-3">
    <input type="reset" class=" btn btn-danger" value="重置" ng-click="reset()">
    <input type="submit" class="btn btn-primary " value="提交" ng-disabled="myForm.$invalid">
  </div>

js:

$scope.reset=function(){
    $scope.myForm.$setPristine();
  }

注:表单中有一个$setPristine()方法将表单复位原始状态,class,$dirty,$pristine会恢复原始状态。但注意表单的错误信息$error并不会被隐藏,所以在验证表单时,记得在每一项错误信息都是由$dirty才判断的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js技巧--转义符&quot;\&quot;的妙用
Jan 09 Javascript
不间断滚动JS打包类,基本可以实现所有的滚动效果,太强了
Dec 08 Javascript
有关于JS构造函数的重载和工厂方法
Apr 07 Javascript
用模版生成HTML的的框架jquery.tmpl使用详解
Jan 07 Javascript
jQuery判断多个input file 都不能为空的例子
Jun 23 Javascript
详解JavaScript跨域总结与解决办法
Oct 31 Javascript
简单实现IONIC购物车功能
Jan 10 Javascript
JavaScript实现实时更新系统时间的实例代码
Apr 04 Javascript
IScroll那些事_当内容不足时下拉刷新的解决方法
Jul 18 Javascript
微信小程序实现选项卡功能
Jun 19 Javascript
Openlayers实现测量功能
Sep 25 Javascript
DWR内存兼容及无法调用问题解决方案
Oct 16 Javascript
Javascript基础回顾之(三) js面向对象
Jan 31 #Javascript
Javascript基础回顾之(二) js作用域
Jan 31 #Javascript
Javascript基础回顾之(一) 类型
Jan 31 #Javascript
jQuery使用siblings获取某元素所有同辈(兄弟姐妹)元素用法示例
Jan 30 #Javascript
AngularJS报错$apply already in progress的解决方法分析
Jan 30 #Javascript
JavaScript基础之AJAX简单的小demo
Jan 29 #Javascript
JavaScript Date 知识浅析
Jan 29 #Javascript
You might like
php定时计划任务的实现方法详解
2013/06/06 PHP
浅谈PHP命令执行php文件需要注意的问题
2016/12/16 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
实例讲解PHP中使用命名空间
2019/01/27 PHP
jquery监控数据是否变化(修正版)
2011/04/12 Javascript
疯狂Jquery第一天(Jquery学习笔记)
2012/05/11 Javascript
js实现的复制兼容chrome和IE
2014/04/03 Javascript
举例详解AngularJS中ngShow和ngHide的使用方法
2015/06/19 Javascript
jQuery实现大转盘抽奖活动仿QQ音乐代码分享
2015/08/21 Javascript
jQuery中的ajax async同步和异步详解
2015/09/29 Javascript
Bootstrap每天必学之弹出框(Popover)插件
2016/04/25 Javascript
Webpack打包慢问题的完美解决方法
2017/03/16 Javascript
JS实现的雪花飘落特效示例
2019/12/03 Javascript
Vue.js中Line第三方登录api的实现代码
2020/06/29 Javascript
Python 自动刷博客浏览量实例代码
2017/06/14 Python
利用Python实现Windows下的鼠标键盘模拟的实例代码
2017/07/13 Python
Python中循环引用(import)失败的解决方法
2018/04/22 Python
opencv python 傅里叶变换的使用
2018/07/21 Python
python爬虫之线程池和进程池功能与用法详解
2018/08/02 Python
解决PySide+Python子线程更新UI线程的问题
2019/01/11 Python
numpy中的ndarray方法和属性详解
2019/05/27 Python
python 遍历pd.Series的index和value
2019/11/26 Python
基于pytorch中的Sequential用法说明
2020/06/24 Python
Python安装Bs4的多种方法
2020/11/28 Python
Python3+Flask安装使用教程详解
2021/02/16 Python
10个很棒的 CSS3 开发工具 推荐
2011/05/16 HTML / CSS
房产买卖委托公证书
2014/04/04 职场文书
生物技术专业求职信
2014/06/10 职场文书
社团活动总结报告
2014/06/27 职场文书
劳模先进事迹材料
2014/12/24 职场文书
爱国主义教育基地观后感
2015/06/18 职场文书
婚宴领导致辞
2015/07/28 职场文书
公司员工离职感言
2015/08/03 职场文书
推荐六本经典文学奖书籍:此生必读
2019/08/22 职场文书
Redis6.0搭建集群Redis-cluster的方法
2021/05/08 Redis
聊聊Python String型列表求最值的问题
2022/01/18 Python