原文  http://www.cnblogs.com/woshinidezhu/p/Form-validation-with-AngularJS.html

客户端表单验证是AngularJS里面最酷的功能之一。 AngularJS表单验证可以让你从一开始就写出一个具有交互性和可相应的现代HTML5表单。

在AngularJS中,有许多表单验证指令。在这里,我们将谈谈几个最流行指令,然后我们将讨论如何编写自定义的验证。

  1. <form name="form">
  2. <label name="email">Your email</label>
  3. <input type="email" name="email" ng-model="email" placeholder="Email Address" />
  4. </form>

AngularJS使得我们可以在不用额外努力的情况下轻松的处理客户端表单验证。虽然我们不能仅靠客户端验证来保持我们的Web应用程序的安全性,但他们提供了良好即时反馈到表单上。

要使用表单验证,我们首先必须确保 form 标签有一个 name 属性,像上面的例子一样。明白了吗?太好了!

所有输入字段可以进行一些基本的验证,例如最小长度,最大长度,等等,这些都是HTML5标签的属性验证。

通常需要在 form 标签中加上 novalidate 属性, 这将禁用浏览器自带的验证功能,从而使用AngularJS提供的验证。

让我们来看看我们可以在input设置哪些验证:

必填

验证是否已输入字符,只需在标签上加上 required :

  1. <input type="text" required />

最小长度

验证输入至少输入{number}个字符,使用AngularJS指令的 ng-minlength=“{number}” :

  1. <input type="text" ng-minlength=5 />

最大长度

验证输入字符要小于等于{number}个字符,使用AngularJS指令的 ng-maxlength=“{number}” :

  1. <input type="text" ng-maxlength=20 />

正则匹配

要确保输入匹配一个正则表达式,使用AngularJS的指令 ng-pattern="/PATTERN/" :

  1. <input type="text" ng-pattern="/a-zA-Z/" />

Email

验证输入字符是一个电子邮件地址,只需设定 input 的 type 属性为 email ,像这样:

  1. <input type="email" name="email" ng-model="user.email" />

数字

验证输入字符是一个数字,同样只需设定 input 的 type 属性为 number ,像这样:

  1. <input type="number" name="email" ng-model="user.age" />

Url

验证输入字符是一个URL地址,同样只需设定 input 的 type 属性为 url ,像这样:

  1. <input type="url" name="homepage" ng-model="user.facebook_url" />

自定义验证

AngularJS可以很容易的使用指令来添加自定义验证。例如,我们要验证我们的用户名是可用的(在数据库中不重复)。要做到这一点,我们将实现一个指令,它在输入字符变化时触发一个Ajax请求:

  1. var app = angular.module('validationExample', []);
  2.  
  3. app.directive('ensureUnique', ['$http', function($http) {
  4. return {
  5. require: 'ngModel',
  6. link: function(scope, ele, attrs, c) {
  7. scope.$watch(attrs.ngModel, function() {
  8. $http({
  9. method: 'POST',
  10. url: '/api/check/' + attrs.ensureUnique,
  11. data: {'field': attrs.ensureUnique}
  12. }).success(function(data, status, headers, cfg) {
  13. c.$setValidity('unique', data.isUnique);
  14. }).error(function(data, status, headers, cfg) {
  15. c.$setValidity('unique', false);
  16. });
  17. });
  18. }
  19. }
  20. }]);

验证表单状态

AngularJS将DOM验证的结果保存在$scope对象中。这使我们能够实时做出一些响应。提供给我们的属性有:

请注意,这是这个属性的格式:

  1. formName.inputFieldName.property

未修改过的表单

布尔值属性,表示用户是否修改了表单。如果为 ture ,表示没有修改过; false 表示修改过:

  1. formName.inputFieldName.$pristine;

修改的表单

布尔型属性,当且仅当用户实际已经修改的表单。不管表单是否通过验证:

  1. formName.inputFieldName.$dirty

经过验证的表单

布尔型属性,它指示表单是否通过验证。如果表单当前通过验证,他将为 true :

  1. formName.inputFieldName.$valid

未通过验证的表单

布尔型属性,它指示表单是否通过验证。如果表单当前没有通过验证,他将为 true :

  1. formName.inputFieldName.$invalid

最后两个属性在用于DOM元素的显示或隐藏时是特别有用的。同时,如果要设置特定的class时,他们也非常有用的。

错误

另一个有用的属性是AngularJS提供给我们的$error对象。这个对象包含 input 的每一个验证是有效的还是无效的(一个集合)。为了访问这个属性,使用下面的语法:

  1. formName.inputfieldName.$error

如果验证失败,则此属性将是true的,而如果它是false的,那么该值通过验证的。

无害的一些样式

当AngularJS处理的表单验证时,它将根据验证的状态增加一些特定的class属性。这些class被命名为类似的属性,我们可以检查。

  1. .ng-pristine {}
  2. .ng-dirty {}
  3. .ng-valid {}
  4. .ng-invalid {}

这些class对应着其对应的验证对象的结果。

当一个字段是无效的,   .ng-invalid 将被应用到这个字段上。我们可以通过css来设置这些class的样式:

  1. input.ng-invalid {
  2. border: 1px solid red;
  3. }
  4. input.ng-valid {
  5. border: 1px solid green;
  6. }

 

全部放在一起

让我们编写一个注册表单。本申请表单将包括这个人的名字,他们的电子邮件,以及所需的用户名。

让我们定义一个 form 表单:

  1. <div class="row">
  2. <div class="large-12 columns">
  3. <label>Your name</label>
  4. <input type="text"
  5. placeholder="Name"
  6. name="name"
  7. ng-model="signup.name"
  8. ng-minlength=3
  9. ng-maxlength=20 required />
  10. </div>
  11. </div>

首先我想说明我使用了  Foundation  作为我的css框架,所以你将在代码中看到它的相关语法。 我们增加了一个名字为name的输入框,并且对象绑定在 $scope 对象的 signup.name 对象上(通过ng-model)。

我们还设置了几个验证。这些验证分别是:我们必须有一个长度为3个或更多字符的名字。并且最大长度限制为20个字符(21或更多的个字符将是无效的)。最后,我们设置名称应该是必填的。

当如果表单无效时,让我们用属性来控制显示还是隐藏错误列表。我们还将使用 $dirty 属性,以确保当用户没有输入字符前错误提示不显示:

  1. <div class="row">
  2. <div class="large-12 columns">
  3. <label>Your name</label>
  4. <input type="text"
  5. placeholder="Name"
  6. name="name"
  7. ng-model="signup.name"
  8. ng-minlength=3
  9. ng-maxlength=20 required />
  10. <div class="error"
  11. ng-show="signup_form.name.$dirty && signup_form.name.$invalid">
  12. <small class="error"
  13. ng-show="signup_form.name.$error.required">
  14. Your name is required.
  15. </small>
  16. <small class="error"
  17. ng-show="signup_form.name.$error.minlength">
  18. Your name is required to be at least 3 characters
  19. </small>
  20. <small class="error"
  21. ng-show="signup_form.name.$error.maxlength">
  22. Your name cannot be longer than 20 characters
  23. </small>
  24. </div>
  25. </div>
  26. </div>

在之前,当输入内容改变时它只能告诉我们我们输入是否有效。这一次,我们将看到当那些没有通过的验证时的错误信息。

让我们来看看接下来的验证,一个电子邮件:

  1. <div class="row">
  2. <div class="large-12 columns">
  3. <label>Your email</label>
  4. <input type="email"
  5. placeholder="Email"
  6. name="email"
  7. ng-model="signup.email"
  8. ng-minlength=3 ng-maxlength=20 required />
  9. <div class="error"
  10. ng-show="signup_form.email.$dirty && signup_form.email.$invalid">
  11. <small class="error"
  12. ng-show="signup_form.email.$error.required">
  13. Your email is required.
  14. </small>
  15. <small class="error"
  16. ng-show="signup_form.email.$error.minlength">
  17. Your email is required to be at least 3 characters
  18. </small>
  19. <small class="error"
  20. ng-show="signup_form.email.$error.email">
  21. That is not a valid email. Please input a valid email.
  22. </small>
  23. <small class="error"
  24. ng-show="signup_form.email.$error.maxlength">
  25. Your email cannot be longer than 20 characters
  26. </small>
  27. </div>
  28. </div>
  29. </div>

这一次(包括整个表单),我们编写电子邮件字段。请注意,我们设置了input的type属性为email并且添加了 $error.email 错误信息。这是基于AngularJS的电子邮件验证(使用HTML5的属性)。

最后,让我们来看看在我们的最后一个输入框,用户名:

  1. <div class="large-12 columns">
  2. <label>Username</label>
  3. <input type="text"
  4. placeholder="Desired username"
  5. name="username"
  6. ng-model="signup.username"
  7. ng-minlength=3
  8. ng-maxlength=20
  9. ensure-unique="username" required />
  10. <div class="error" ng-show="signup_form.username.$dirty && signup_form.username.$invalid">
  11. <small class="error" ng-show="signup_form.username.$error.required">Please input a username</small>
  12. <small class="error" ng-show="signup_form.username.$error.minlength">Your username is required to be at least 3 characters</small>
  13. <small class="error" ng-show="signup_form.username.$error.maxlength">Your username cannot be longer than 20 characters</small>
  14. <small class="error" ng-show="signup_form.username.$error.unique">That username is taken, please try another</small>
  15. </div>
  16. </div>

在我们的最后一个字段,我们使用我们之前编写的自定义验证。这个自定义验证使用的AngularJS指令:

  1. app.directive('ensureUnique', ['$http', function($http) {
  2. return {
  3. require: 'ngModel',
  4. link: function(scope, ele, attrs, c) {
  5. scope.$watch(attrs.ngModel, function() {
  6. $http({
  7. method: 'POST',
  8. url: '/api/check/' + attrs.ensureUnique,
  9. data: {'field': attrs.ensureUnique}
  10. }).success(function(data, status, headers, cfg) {
  11. c.$setValidity('unique', data.isUnique);
  12. }).error(function(data, status, headers, cfg) {
  13. c.$setValidity('unique', false);
  14. });
  15. });
  16. }
  17. }
  18. }]);

当表单输入是有效的时,它将发送POST api/check/username请求到服务器来检查用户名是否可用。现在,很明显,因为我们在这里只谈论前端代码,我们没有为后端编写测试,尽管很容易。

更新:  根据评论的意见,我已经加入了服务器超时检查。要查看完整的源代码,请点击 here 。

最后,我们加上提交按钮,我们可以使用ng-disabled指令来根据验证是否有效控制按钮的禁用和启用:

  1. <button type="submit" ng-disabled="signup_form.$invalid" class="button radius">Submit</button>

正如我们上面所说的,表单是否有效的属性 $invalid 给我们提供了便利。

更新 2:  虽然立即验证是很棒的,它可以立即提醒用户,但是当他们正在输入很长的能通过验证的文字时,他们讲在输入中途看到错误提示。你可以更好的来处理这一点。当用户点击提交时,或者当他们将光标移开输入框之后。让我们来看看这2种方式。

点击提交后显示验证信息

要在用户试图提交表单时显示的验证,你可以通过在scope中设置一个'submitted'值,并检查该值来控制显示错误。

例如,让我们来看看第一个例子,只有在点击提交表单时才显示错误。使用 ng-show 指令来控制显示,我们可以添加一个检查,看是否已点击提交按钮:

  1. <form name="signup_form" novalidate ng-submit="signupForm()">
  2. <fieldset>
  3. <legend>Signup</legend>
  4. <div class="row">
  5. <div class="large-12 columns">
  6. <label>Your name</label>
  7. <input type="text"
  8. placeholder="Name"
  9. name="name"
  10. ng-model="signup.name"
  11. ng-minlength=3
  12. ng-maxlength=20 required />
  13. <div class="error"
  14. ng-show="signup_form.name.$dirty && signup_form.name.$invalid && signup_form.submitted">
  15. <small class="error"
  16. ng-show="signup_form.name.$error.required">
  17. Your name is required.
  18. </small>
  19. <small class="error"
  20. ng-show="signup_form.name.$error.minlength">
  21. Your name is required to be at least 3 characters
  22. </small>
  23. <small class="error"
  24. ng-show="signup_form.name.$error.maxlength">
  25. Your name cannot be longer than 20 characters
  26. </small>
  27. </div>
  28. </div>
  29. </div>
  30. <button type="submit" class="button radius">Submit</button>
  31. </fieldset>
  32. </form>

现在,那个错误信息的div只将在 signup_form.submitted 为 true 时 显示。我们可以这样实现这个 signupForm 方法:

  1. app.controller('signupController', ['$scope', function($scope) {
  2. $scope.submitted = false;
  3. $scope.signupForm = function() {
  4. if ($scope.signup_form.$valid) {
  5. // Submit as normal
  6. } else {
  7. $scope.signup_form.submitted = true;
  8. }
  9. }
  10. }]);

现在,当用户尝试提交表单并且同时有一个无效的元素时,你可以捕获它,并告诉他们错误的原因。

当时去焦点时验证错误

如果你想保留错误验证的实时性,那么可以在用户离开该输入框时显示错误信息。要做到这一点,我们可以添加一个指令,将添加一个新的变量。

我们使用 ngFocus 指令,它看起来像:

  1. app.directive('ngFocus', [function() {
  2. var FOCUS_CLASS = "ng-focused";
  3. return {
  4. restrict: 'A',
  5. require: 'ngModel',
  6. link: function(scope, element, attrs, ctrl) {
  7. ctrl.$focused = false;
  8. element.bind('focus', function(evt) {
  9. element.addClass(FOCUS_CLASS);
  10. scope.$apply(function() {ctrl.$focused = true;});
  11. }).bind('blur', function(evt) {
  12. element.removeClass(FOCUS_CLASS);
  13. scope.$apply(function() {ctrl.$focused = false;});
  14. });
  15. }
  16. }
  17. }]);

要使用 ngFocus ,我们只需要简单加上这个指令到输入框元素上,像这样:

  1. <input ng-class="{error: signup_form.name.$dirty && signup_form.name.$invalid}" type="text" placeholder="Name" name="name" ng-model="signup.name" ng-minlength=3 ng-maxlength=20 required ng-focus />

加上 ngFocus 指令后,将在输入框的blur和focus事件中注册相应操作,当焦点在该输入框时,它添加一个class(ng-focused),并且该输入框的$focused属性也将变为true。因此,你可以根据需求是否在焦点上来个性化设置显示错误消息。例如:

  1. <div class="error" ng-show="signup_form.name.$dirty && signup_form.name.$invalid && !signup_form.name.$focused">

  

我希望这篇文章可以告诉你如何的很酷的使用AngularJS来进行表单验证。

原文: Form validation with AngularJS  (en)

注:原文有一些demo可供测试,若有需要请查看原文。

(转)AngularJS中使用的表单验证的更多相关文章

  1. 在AngularJS中实现自定义表单验证

    除了一些已经定义好了的验证(例如 必填项.最小长度.最大长度)之外,更常用的,还是需要我们自己定义表单验证,这样才能对于项目中遇到的很多非常规问题给出自己的合适的解决方案. 在表单中控制变量 表单的属 ...

  2. AngularJS中使用的表单验证

    Reference: http://www.tuicool.com/articles/2Qbiqi 客户端表单验证是AngularJS里面最酷的功能之一. AngularJS表单验证可以让你从一开始就 ...

  3. (译) 在AngularJS中使用的表单验证功能【转】

    验证功能是AngularJS里面最酷炫的功能之一,它可以让你写出一个具有良好用户体验的Web应用. 在AngularJS中,有许多用于验证的指令.我们将先学习几个最流行的内置指令,然后再创建一个自定义 ...

  4. (译) 在AngularJS中使用的表单验证功能

    验证功能是AngularJS里面最酷炫的功能之一,它可以让你写出一个具有良好用户体验的Web应用. 在AngularJS中,有许多用于验证的指令.我们将先学习几个最流行的内置指令,然后再创建一个自定义 ...

  5. AngularJs 入门系列-2 表单验证

    对于日常的开发来说,最常见的开发场景就是通过表单编辑数据,这里涉及的问题就是验证问题. angularjs 内置已经支持了常见的验证方式,可以轻松实现表单验证. 1. 绑定 为了方便,我们在 $sco ...

  6. Django中的Form表单验证

    回忆一下Form表单验证的逻辑: 前端有若干个input输入框,将用户输入内容,以字典传递给后端. 后端预先存在一个Form表单验证的基类,封装了一个检测用户输入是否全部通过的方法.该方法会先定义好错 ...

  7. AngularJS学习笔记(二) 表单验证案例(ng-repeat/filter)

    这一节相对来说需要理解的东西不是太多,记住了那些api就行了. 还是一个案例(同样来自miaov),一个表单验证,先上代码,然后再对对应的内容进行解释. <!DOCTYPE html> & ...

  8. yii框架中应用jquery表单验证插件

    效果图: 视图层: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...

  9. AngularJS使用ngMessages进行表单验证

    名称为"ngMessages"的module,通过npm install angular-messages进行安装.在没有使用ngMessages之前,我们可能这样写验证: < ...

随机推荐

  1. JS继承(简单理解版)

    童鞋们,我们今天聊聊js的继承,关于继承,平时开发基本用不到,但是面试没有不考的,我就想问,这是人干的事吗? 好吧,迫于社会主义核心价值观,我们今天就来简单说一说js的继承,谁让它是面向对象编程很重要 ...

  2. 移动端click点透bug

    移动端click点透bug click点透bug有一个特定的产生情况: 当上层元素是tap事件,且tap后消失,下层元素是click事件.这个时候,tap上层元素的时候就会触发下层元素的click事件 ...

  3. 字段username没有默认值查询(设计数据库一定要养成好习惯,不是主键最好设置为可以为空)

    今天创建了一个表,但是username作为外键(不是主键)没有设置为可以为空,结果提交表单时忘记写username就报错了

  4. 开发笔记-19/10/28 -SpringBoot @Value 获取配置参数

    1. 在application.properties 定义参数 role.taskEvent :参数名称 4:值 ## ---------------------任务角色--------------- ...

  5. java读取字符串,生成txt文件

    /** * 读取字符串,生成txt 文件 已解决未设置编码时,在项目中直接打开文件,中文乱码问题 * WriteText.writeToText(musicInfo,fileName)直接调用 * * ...

  6. springcloud系列13 config的客户端使用

    config客户端的使用: 也是首先要引入依赖: <dependency> <groupId>org.springframework.cloud</groupId> ...

  7. UMP系统功能 分库分表

  8. AutoIt自动化编程(1)【转】

    1.运行程序 Run 命令或者函数用来运行外部可执行文件 AU3:Run ( "文件名" [, "工作目录" [, 标志]] ) EXAMPLE: AU3:Ru ...

  9. [JZOJ4649] 【NOIP2016提高A组模拟7.17】项链

    题目 描述 题目大意 给你一堆小串,每个小串都有一定的分数. 让你构造一个字符串,若子串中出现了之前的小串,就可以得到对应的分数(可以重复) 问最大分数. 思考历程 一看这题就知道是什么字符串方面的算 ...

  10. sudo apt-get常用命令

    一.卸载 1. sudo apt-get autoclean 如果你的硬盘空间不大的话,可以定期运行这个程序,将已经删除了的软件包的.deb安装文件从硬盘中删除掉.如果你仍然需要硬盘空间的话,可以试试 ...