AngularJS入门之数据验证

AngularJS自带了对表单或控件的输入数据进行验证的功能,对于Html5的基础控件均有内建的验证器,以下列举了所有支持的验证类型:

  • email
  • max
  • maxlength
  • min
  • minlength
  • number
  • pattern
  • required
  • url
  • date
  • datetimelocal
  • time
  • week
  • month

AngularJS会在元素上自动添加如下样式:

  • ng-valid: 验证通过
  • ng-invalid: 验证失败
  • ng-valid-[key]: 由$setValidity添加的所有验证通过的值
  • ng-invalid-[key]: 由$setValidity添加的所有验证失败的值
  • ng-pristine: 控件为初始状态
  • ng-dirty: 控件输入值已变更
  • ng-touched: 控件已失去焦点
  • ng-untouched: 控件未失去焦点
  • ng-pending: 任何为满足$asyncValidators的情况

示例1:

 1 <!DOCTYPE >
 2 <html>
 3 <head>
 4     <style type="text/css">
 5         .ng-invalid.ng-dirty {
 6             border-color: #FA787E;
 7         }
 8
 9         .ng-valid.ng-dirty {
10             border-color: #78FA89;
11         }
12
13         .ng-pristine.ng-pristine {
14             border-color: #ffd800;
15         }
16     </style>
17
18     <script src="/Scripts/angular.js"></script>
19     <script type="text/javascript">
20         (function () {
21             var app = angular.module(‘validationTest‘, []);
22
23             app.controller(‘myController‘, [‘$scope‘, function ($scope) {
24                 $scope.students = [];
25
26                 $scope.addStudent = function (stu) {
27                     $scope.students.push(stu);
28                     $scope.stu = {};
29                 };
30             }]);
31         })();
32     </script>
33 </head>
34 <body ng-app="validationTest" ng-controller="myController">
35     <form name="myForm" ng-submit="myForm.$valid && addStudent(stu)" novalidate>
36         Name:
37         <input name="name" ng-model="stu.name" required />
38         <span ng-hide="myForm.name.$pristine || myForm.name.$valid" ng-show="myForm.name.$invalid">Name is required.</span>
39         <br />
40         Age:
41         <input name="age" ng-model="stu.age" type="number" max="200" min="1" required />
42         <span ng-hide="myForm.age.$pristine || myForm.age.$valid" ng-show="myForm.age.$invalid">Age is required and should between 1-200.</span>
43         <br />
44         Sex:
45         <select name="sex" ng-model="stu.sex" required>
46             <option value="0">Male</option>
47             <option value="1">Female</option>
48         </select>
49         <span ng-hide="myForm.sex.$pristine || myForm.sex.$valid" ng-show="myForm.sex.$invalid">Sex is required.</span>
50         <br />
51         Email:
52         <input name="email" ng-model="stu.email" type="email" />
53         <span ng-hide="myForm.email.$pristine || myForm.email.$valid" ng-show="myForm.email.$invalid">Email is not correct.</span>
54         <br />
55         Blog:
56         <input name="blog" ng-model="stu.blog" type="url" />
57         <span ng-hide="myForm.blog.$pristine || myForm.blog.$valid" ng-show="myForm.blog.$invalid">Blog is not correct.</span>
58         <br />
59         Birthday:
60         <input name="birthday" ng-model="stu.birthday" type="datetime-local" />
61         <span ng-hide="myForm.birthday.$pristine || myForm.birthday.$valid" ng-show="myForm.birthday.$invalid">Birthday is not correct.</span>
62
63         <div>myForm.$valid is {{myForm.$valid}}</div>
64         <div>myForm.$invalid is {{myForm.$invalid}}</div>
65         <div>myForm.$pristine is {{myForm.$pristine}}</div>
66         <div>myForm.$dirty is {{myForm.$dirty}}</div>
67         <div>myForm.$submitted is {{myForm.$submitted}}</div>
68
69         <div>myForm.age.$error is {{myForm.age.$error}}</div>
70
71         <input type="submit" value="Submit" />
72     </form>
73     <hr />
74     <div ng-repeat="stu in students">
75         <span>Name:{{ stu.name }}</span>
76         <span>Age:{{ stu.age }}</span>
77         <span>Sex:{{ stu.sex == 0 ? "Male" : "Female" }}</span>
78         <span>Email:{{ stu.email }}</span>
79         <span>Blog:{{ stu.blog }}</span>
80         <span>Birthday:{{ stu.birthday }}</span>
81         <hr />
82     </div>
83 </body>
84 </html>

示例1中,首先对form添加novalidate属性来禁用form的浏览器默认验证行为:

<form name="myForm" ng-submit="myForm.$valid && addStudent(stu)" novalidate>

对必填的控件添加required属性:

<input name="name" ng-model="stu.name" required />

本例有2种验证结果展示方式:

1. 控件边框颜色变化:

本文开头已说过,AngularJS会在验证控件后自动添加内建的样式名称,因此,我们只需对这些预定义的样式名称添加实际的样式代码即可:

 1 .ng-invalid.ng-dirty {
 2     border-color: #FA787E;
 3 }
 4
 5 .ng-valid.ng-dirty {
 6     border-color: #78FA89;
 7 }
 8
 9 .ng-pristine.ng-pristine {
10     border-color: #ffd800;
11 }

2. 文字显示验证失败原因(以name控件为例):

<span ng-hide="myForm.name.$pristine || myForm.name.$valid" ng-show="myForm.name.$invalid">Name is required.</span>

ng-hide:当name为初始化状态或者通过验证的状态,无需显示错误信息提示;

ng-show:当name控件验证失败时,展示错误提示信息。

AngularJS还提供了一些内建的状态值,方便我们直接使用:

  • $dirty:内容已变更
  • $pristine:初始化状态
  • $valid:验证通过
  • $invalid:验证失败
  • $submitted:已提交
  • $error:所有验证失败的hash对象
  • $$success:所有验证通过的hash对象
  • $pending:所有pending(异步验证)的hash对象

form中添加ng-submit属性,并且当myForm.$valid(即myForm中包含的所有验证均通过时,该值才为true)提交表单并调用addStudent方法:

<form name="myForm" ng-submit="myForm.$valid && addStudent(stu)" novalidate>

这样,当在页面上填写完有效的信息后,我们就可以将学生对象添加到Controller的students中,并由于双向绑定的特性,最终将提交的信息同步展示到页面上。

自定义验证器

你可能也猜到了,AngularJS也为我们准备好了自定义验证的方式。AngularJS实际上是通过自定义Directive,并在link中将验证方法添加到指定控件的$validators中, 在$validators中定义的对象必须有modelValue和viewValue两个参数,AngluarJS会在底层调用$setValidity来验证它。

我们看一个简单的例子,自定义验证Directive:myInteger(my-integer),输入值必须是以“1”开头,并为3位数字。

示例2:

 1 <!DOCTYPE >
 2 <html>
 3 <head>
 4     <script src="/Scripts/angular.js"></script>
 5     <script type="text/javascript">
 6         (function () {
 7             var app = angular.module(‘customValidationTest‘, []);
 8
 9             var INTEGER_REGEXP = /^\-?1\d{2}$/;
10             app.directive(‘myInteger‘, function () {
11                 return {
12                     require: ‘ngModel‘,
13                     link: function (scope, elm, attrs, ctrl) {
14                         ctrl.$validators.myInteger = function (modelValue, viewValue) {
15                             if (ctrl.$isEmpty(modelValue)) {
16                                 return true;
17                             }
18
19                             if (INTEGER_REGEXP.test(viewValue)) {
20                                 return true;
21                             }
22
23                             return false;
24                         };
25                     }
26                 };
27             });
28
29         })();
30     </script>
31 </head>
32 <body ng-app="customValidationTest">
33     <form name="myForm" ng-submit="myForm.$valid" novalidate>
34         My integer:<input name="myInteger" ng-model="custInt" my-integer required />
35         <span ng-hide="myForm.myInteger.$pristine || myForm.myInteger.$valid" ng-show="myForm.myInteger.$invalid">My integer is required and should be the value 1xx.</span>
36     </form>
37 </body>
38 </html>

修改AngularJS的内建验证器方法

当然如果你需要重写AngularJS内建的验证也是可以的。

示例3(官方Demo):

 1 <!DOCTYPE >
 2 <html>
 3 <head>
 4     <script src="/Scripts/angular.js"></script>
 5     <script type="text/javascript">
 6         (function () {
 7             var app = angular.module(‘modifyBuildinValidatorTest‘, []);
 8
 9             app.directive(‘overwriteEmail‘, function () {
10                 var EMAIL_REGEXP = /^[a-z0-9!#$%&‘*+/=?^_`{|}~.-]+@example\.com$/i;
11                 return {
12                     require: ‘ngModel‘,
13                     restrict: ‘‘,
14                     link: function (scope, elm, attrs, ctrl) {
15                         // 仅当存在ngModel且存在email这个验证器的时候才替换
16                         if (ctrl && ctrl.$validators.email) {
17
18                             // 这里将重写AngularJS默认的email验证器
19                             ctrl.$validators.email = function (modelValue) {
20                                 return ctrl.$isEmpty(modelValue) || EMAIL_REGEXP.test(modelValue);
21                             };
22                         }
23                     }
24                 };
25             });
26         })();
27     </script>
28 </head>
29 <body ng-app="modifyBuildinValidatorTest">
30     <form name="form" class="css-form" novalidate>
31         <div>
32             Overwritten Email:
33             <input type="email" ng-model="myEmail" overwrite-email name="overwrittenEmail" />
34             <span ng-show="form.overwrittenEmail.$error.email">This email format is invalid!</span><br>
35             Model: {{myEmail}}
36         </div>
37     </form>
38 </body>
39 </html>

在创建Directive:overwriteEmail并定义它的行为时,首先判断是否当前控件存在,且控件上已定义了email这个验证器,若存在则改写其验证。

本例中,改写后的email验证,将使以@example.com为后缀的email地址才能通过验证。

本篇讲述了AngularJS的控件验证方式以及自定义验证器,学会了使用验证器,我们就可以控制页面输入数据的合法性了,这样,我们的页面逻辑就更加完善了。

参考资料

AngularJS官方文档:https://docs.angularjs.org/guide/forms

CodeSchool快速入门视频:http://campus.codeschool.com/courses/shaping-up-with-angular-js/intro

时间: 2024-04-11 09:00:54

AngularJS入门之数据验证的相关文章

AngularJS快速入门指南14:数据验证

thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table.reference>thead>tr>td, table.reference>tbody>tr>td, table.reference>tfoot>tr>td { padding: 8px; line-height: 1.42857143; vertic

AngularJs 入门系列-2 表单验证

对于日常的开发来说,最常见的开发场景就是通过表单编辑数据,这里涉及的问题就是验证问题. angularjs 内置已经支持了常见的验证方式,可以轻松实现表单验证. 1. 绑定 为了方便,我们在 $scope 上下文对象上创建一个 model 来表示我们编辑的内容. $scope.model = { id : 8, name: "alice", email: "[email protected]" }; angularjs 的验证需要表单的配合,为了能够访问表单,我们需

ASP.NET MVC 入门8、ModelState与数据验证

数据验证包括服务器端验证和客户端的验证, 本文介绍的MVC数据库端的数据验证实现. 客户端的数制验证可以使用JQuery的验证插件来实现. Html.ValidationMessage()的时候,就是从ViewData.ModelState中检测是否有指定的KEY,如果存在,就提示错误信息. ValidationMessage(modelName) 指定控件的验证错误信息; ValidationSummary() 表单所有控件的验证错误信息. 验证未通过, 目标控件和验证错误信息HTML标签,都

[转]ASP.NET MVC 入门8、ModelState与数据验证

ViewData有一个ModelState的属性,这是一个类型为ModelStateDictionary的ModelState类型的字典集合.在进行数据验证的时候这个属性是比较有用的.在使用Html.ValidationMessage()的时候,就是从ViewData.ModelState中检测是否有指定的KEY,如果存在,就提示错误信息.例如在前一篇文章ASP.NET MVC 入门7.Hellper与数据的提交与绑定中使用到的UpdateModel方法: 我们在View中使用Html.Vali

WPF MVVM从入门到精通8:数据验证

原文:WPF MVVM从入门到精通8:数据验证 WPF MVVM从入门到精通1:MVVM模式简介 WPF MVVM从入门到精通2:实现一个登录窗口 WPF MVVM从入门到精通3:数据绑定 WPF MVVM从入门到精通4:命令和事件 WPF MVVM从入门到精通5:PasswordBox的绑定 WPF MVVM从入门到精通6:RadioButton等一对多控件的绑定 WPF MVVM从入门到精通7:关闭窗口和打开新窗口 WPF MVVM从入门到精通8:数据验证 完整示例代码下载LoginDemo

ASP.NET MVC3 入门指南之数据验证[源码RAR下载]

http://www.cnblogs.com/BingoLee/archive/2011/12/23/2298822.html 前言: 无论你编写什么样的网页程序,都需要对用户的数据进行验证,以确数据的有效性和完整性. ASP.NET MVC3允许你采用一种被称之为“数据注释”的方式来进行数据验证,这种验证包含了客户端浏览器 和服务器端的双重验证.或许你会问为什么要进行两次验证?首先,客户端验证能够直接响应客户,减少了服务 器压力的同时还提高了用户体验,但是你永远不能信任来自客户端的信息(用户可

Angular系列----AngularJS入门教程04:迭代器过滤(转载)

我们在上一步做了很多基础性的训练,所以现在我们可以来做一些简单的事情喽.我们要加入全文检索功能(没错,这个真的非常简单!).同时,我们也会写一个端到端测试,因为一个好的端到端测试可以帮上很大忙.它监视着你的应用,并且在发生回归的时候迅速报告. 请重置工作目录: git checkout -f step-3 我们的应用现在有了一个搜索框.注意到页面上的手机列表随着用户在搜索框中的输入而变化. 步骤2和步骤3之间最重要的不同在下面列出.你可以在GitHub里看到完整的差别. 控制器 我们对控制器不做

Angular系列---- AngularJS入门教程03:AngularJS 模板(转载)

是时候给这些网页来点动态特性了——用AngularJS!我们这里为后面要加入的控制器添加了一个测试. 一个应用的代码架构有很多种.对于AngularJS应用,我们鼓励使用模型-视图-控制器(MVC)模式解耦代码和分离关注点.考虑到这一点,我们用AngularJS来为我们的应用添加一些模型.视图和控制器. 请重置工作目录: git checkout -f step-2 我们的应用现在有了一个包含三部手机的列表. 步骤1和步骤2之间最重要的不同在下面列出.,你可以到GitHub去看完整的差别. 视图

Angular系列----AngularJS入门教程01:AngularJS模板 (转载)

是时候给这些网页来点动态特性了——用AngularJS!我们这里为后面要加入的控制器添加了一个测试. 一个应用的代码架构有很多种.对于AngularJS应用,我们鼓励使用模型-视图-控制器(MVC)模式解耦代码和分离关注点.考虑到这一点,我们用AngularJS来为我们的应用添加一些模型.视图和控制器. 请重置工作目录: git checkout -f step-2 我们的应用现在有了一个包含三部手机的列表. 步骤1和步骤2之间最重要的不同在下面列出.,你可以到GitHub去看完整的差别. 视图