AngularJS 表单验证
2015-07-18 21:00
567 查看
Chrome的Angular插件
Chrome浏览器有一些插件可以提高Angular开发的开发效率,我本人很喜欢的有两款,分别是Angular Scope Inspector和Angular watchers。前者可以查看angular的$scope属性,后者可以统计每个app的所有监控(watch)的变量数。
这两个插件都可以从Chrome应用商店内下载安装,当然,你也可以搜索到很多其它的优秀的Angular插件,他们能完成的功能基本大同小异,你可以根据自己的喜好选择其它的插件。可能会因网络原因无法在线安装,修改hosts文件即可。
Angular Scope Inspector插件安装好后,按F12打开开发者工具,选择左边的dom节点,可在右边的Scope Inspector标签内看到dom元素所绑定的对象。
![](http://static.oschina.net/uploads/space/2015/0718/162815_cfHR_2261820.png)
Angular watchers插件安装好后,可在$$Watchers中看到监控的变量个数,可用于评估一个Angular单页面应用的性能。
![](http://static.oschina.net/uploads/space/2015/0718/162815_oRPM_2261820.png)
Angular中表单数据校验指令
Angular中比较常用的指令包括 ng-required、ng-minlength、ng-maxlength、ng-pattern等,它们的用法基本类似,可以从angular手册中查看到更多指令,它们可应用于特定类型的表单元素。Angular会为视图中的每一个form元素创建一个数据对象,该对象存储关于表单大量可用信息。常用的关于表单状态的属性如下:
属性 | 值 | 含义 |
$valid | Boolean | 标识你当前设定的数据校验规则是否通过 |
$invalid | Boolean | 标识你当前设定的数据校验规则是否未通过 |
$pristine | Boolean | 如果表单没有使用则为True |
$dirty | Boolean | 如果表单有使用到则为True |
我们先构建一个表单:
<form name="formName" novalidate> <input type="text" name="name" ng-model="user.name" ng-pattern="/^[0-9]*$/" ng-required="true"> <p ng-show="formName.name.$invalid" style="color:red">此处不能为空</p> <p ng-show="formName.name.$invalid" style="color:red">此处数据无效,只能输入数字</p> <button type="submit" ng-disabled="formName.$invalid" class="btn btn-primary">提交</button> </form>
其中,使用novalidate禁用浏览器自带的数据校验功能,ng-pattern指令用于匹配正则表达式,/^[0-9]*$/限定了输入数据只能是数字。表单显示效果如下:
![](http://static.oschina.net/uploads/space/2015/0718/200927_wXtj_2261820.png)
当输入正确数据时,错误提醒会自动消失,submit按钮也会处于可用状态:
![](http://static.oschina.net/uploads/space/2015/0718/201525_pNB8_2261820.png)
Angular会自动为每个form元素在$scope服务中创建一个对象,其名称为form元素的name属性,比如本例中,$scope服务中创建了formName对象,formName对象中包含了$valid等属性,我们可以借助Angular Scope Inspector插件查看此对象的所有属性,如图所示:
![](http://static.oschina.net/uploads/space/2015/0718/202349_97uP_2261820.png)
Angular在formName对象中还为每一个表单元素创建了一个子对象,其名称为input元素的name属性,本例中的text输入框的name="name",如上图中红色框中所示。name对象中包含了该输入框的所有可用校验信息,我们可以通过formName.name.$invalid这样的方式调用其值。值得一提的是,其中包含一个$error对象,其中包含了进一步的详细校验信息,由于我们在此例中设置了ng-model和ng-pattern两个指令,因此$error对象中可包含required和pattern两个属性,可通过formName.name.$error.required这样的方式直接获取其值。
现在基于bootstrap样式表,给出一个复杂的例子,虽然看起来复杂,但是完全基于基本的angular数据校验特性:
<form class="form-horizontal" name="loginSettingform" ng-submit="putUserSettingLogin()" novalidate> <div class="form-group"> <label class="col-sm-2 control-label"> </label> <div class="col-sm-10"> <div class="checkbox"> <label> <input type="checkbox" ng-model="loginSetting.logout"> 启用登出时间设置 </label> </div> </div> </div> <div class="form-group" ng-class="{'has-error':loginSettingform.logousecond.$invalid&&loginSettingform.logousecond.$dirty}"> <label for="a1" class="col-sm-2 control-label">登出时间(分钟) <span class="required">*</span></label> <div class="col-sm-2"> <input type="text" class="form-control input-sm" id="a1" name="logousecond" ng-disabled="!loginSetting.logout" ng-model="loginSetting.logousecond" placeholder="登出时间(分钟)" ng-required="true" ng-pattern="/^([1-9][0-9]{0,2}|1[0-3][0-9][0-9]|14[0-3][0-9]|1440)$/"> </div> <div class="col-sm-8"> <a href="javascript:;" data-toggle="tooltip" data-placement="right" title="登出时间应该是1到1440的整数"> <span class="glyphicon glyphicon-question-sign"></span> </a> <span class="validok" ng-class="{'validfail':loginSettingform.logousecond.$invalid&&loginSettingform.logousecond.$dirty}"> 登出时间应该是1到1440的整数</span> </div> </div> <div class="form-group" ng-class="{'has-error':loginSettingform.lockmaxcount.$invalid&&loginSettingform.lockmaxcount.$dirty}"> <label for="a2" class="col-sm-2 control-label">最大错误次数 <span class="required">*</span></label> <div class="col-sm-2"> <input type="text" class="form-control input-sm" id="a2" name="lockmaxcount" ng-model="loginSetting.lockmaxcount" placeholder="最大错误次数" ng-required="true" ng-pattern="/^([1-9][0-9]{0,1}|100)$/"> </div> <div class="col-sm-8"> <span class="validok" ng-class="{'validfail':loginSettingform.lockmaxcount.$invalid&&loginSettingform.lockmaxcount.$dirty}"> 最大错误次数应该是1到100的整数</span> </div> </div> <div class="form-group"> <div class="col-sm-offset-1"> <button type="submit" ng-disabled="loginSettingform.$invalid" class="btn btn-primary btn-sm col-sm-2"> 确 定 </button> </div> </div> </form>
兼容性讨论
最后值得注意的是,Angular的数据校验指令,依赖于浏览器自身的数据功能,在使用时一定要进行浏览器兼容性测试。相关文章推荐
- AngularJS(一)
- 外部javascript 方法修改 angularjs 中$rootScope和$scope
- 【转载】angularJs模块ui-router之路由控制
- 【转载】angularJs模块ui-router之状态嵌套和视图嵌套
- 简话Angular 01 初识Angular 数据绑定
- [Angularjs]视图和路由(四)
- 拥抱AngularJS
- AngularJS性能优化心得,自己踩过的抗,及一些别人的经验(转哦)
- StackOverFlow精彩问答赏析:有jQuery背景的开发者如何建立起AngularJS的思维模式?
- AngularJs记录学习01
- AngularJs中$cookies的用法
- 学习 AngularJs 终于有点进步了。
- angular实例模态【modal】
- 初次学习AngularJS
- angular学习注意事项
- html中调用angularjs函数需要加上()
- Notepad 关于angularJS的自动填充不靠谱
- Angular 监听路由变化事件
- angularjs应用骨架(4)
- AngularJs中文社区学习资料