博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AngularJS中使用的表单验证
阅读量:7236 次
发布时间:2019-06-29

本文共 6356 字,大约阅读时间需要 21 分钟。

Reference: http://www.tuicool.com/articles/2Qbiqi

 

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

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

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

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

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

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

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

必填

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

最小长度

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

最大长度

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

正则匹配

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

Email

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

数字

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

Url

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

自定义验证

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

var app = angular.module('validationExample', []);app.directive('ensureUnique', ['$http', function($http) { return { require: 'ngModel', link: function(scope, ele, attrs, c) { scope.$watch(attrs.ngModel, function() { $http({ method: 'POST', url: '/api/check/' + attrs.ensureUnique, data: { 'field': attrs.ensureUnique} }).success(function(data, status, headers, cfg) { c.$setValidity('unique', data.isUnique); }).error(function(data, status, headers, cfg) { c.$setValidity('unique', false); }); }); } } }]);

验证表单状态

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

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

formName.inputFieldName.property

未修改过的表单

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

formName.inputFieldName.$pristine;

修改的表单

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

formName.inputFieldName.$dirty

经过验证的表单

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

formName.inputFieldName.$valid

未通过验证的表单

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

formName.inputFieldName.$invalid

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

错误

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

formName.inputfieldName.$error

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

无害的一些样式

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

.ng-pristine {}.ng-dirty {}.ng-valid {}.ng-invalid {}

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

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

input.ng-invalid {  border: 1px solid red;}input.ng-valid { border: 1px solid green; }

全部放在一起

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

让我们定义一个 form 表单:

Signup

这个表单的名字是 signup_form   ,当我们点击提交时我们将调用 signupForm()方法 .

现在,让我们添加用户的 Name 属性:

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

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

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

Your name is required.
Your name is required to be at least 3 characters
Your name cannot be longer than 20 characters

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

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

Your email is required.
Your email is required to be at least 3 characters
That is not a valid email. Please input a valid email.
Your email cannot be longer than 20 characters

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

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

Please input a username
Your username is required to be at least 3 characters
Your username cannot be longer than 20 characters
That username is taken, please try another

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

app.directive('ensureUnique', ['$http', function($http) { return { require: 'ngModel', link: function(scope, ele, attrs, c) { scope.$watch(attrs.ngModel, function() { $http({ method: 'POST', url: '/api/check/' + attrs.ensureUnique, data: { 'field': attrs.ensureUnique} }).success(function(data, status, headers, cfg) { c.$setValidity('unique', data.isUnique); }).error(function(data, status, headers, cfg) { c.$setValidity('unique', false); }); }); } } }]);

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

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

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

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

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

点击提交后显示验证信息

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

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

Signup
Your name is required.
Your name is required to be at least 3 characters
Your name cannot be longer than 20 characters

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

app.controller('signupController', ['$scope', function($scope) { $scope.submitted = false; $scope.signupForm = function() { if ($scope.signup_form.$valid) { // Submit as normal } else { $scope.signup_form.submitted = true; } } }]);

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

当时去焦点时验证错误

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

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

app.directive('ngFocus', [function() { var FOCUS_CLASS = "ng-focused"; return { restrict: 'A', require: 'ngModel', link: function(scope, element, attrs, ctrl) { ctrl.$focused = false; element.bind('focus', function(evt) { element.addClass(FOCUS_CLASS); scope.$apply(function() {ctrl.$focused = true;}); }).bind('blur', function(evt) { element.removeClass(FOCUS_CLASS); scope.$apply(function() {ctrl.$focused = false;}); }); } } }]);

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

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

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

转载地址:http://phofm.baihongyu.com/

你可能感兴趣的文章
Oracle-压缩数据
查看>>
XenServer 6.5实战系列之五:XenCenter 6.5
查看>>
PXE方式安装Centos5详解
查看>>
气泡图在开源监控工具中的应用效果
查看>>
让Ubuntu和Android同时运行(Ubuntu on Android)
查看>>
Error 6 initializing SQL*Plus,解决方案:
查看>>
Windows 7保留分区安装系统无法启动、Win7安装XP、VHD启动
查看>>
WINS基本工作原理
查看>>
小玩流媒体播放——HLS流媒体点播系统
查看>>
Office 365系列之十三:Office 365管理员角色
查看>>
烂泥:nginx负载均衡
查看>>
JavaScript(React Native、Node.js等)移动、服务端通吃的全栈语言
查看>>
海量运维常用技术之--HAProxy网站负载均衡应用
查看>>
SCCM2012SP1---安装客户端代理软件
查看>>
CLI使用案例2:轻松大并发地拉取大数据到本地
查看>>
在SharePoint Workflow中使用InfoPath Form的几个Tips
查看>>
Powershell管理系列(十一)Exchange完全访问权限邮箱的设置
查看>>
【读书笔记】Java面向对象编程
查看>>
float4数据类型
查看>>
Eclipse代码自动完成功能
查看>>