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

前端之家收集整理的这篇文章主要介绍了(译) 在AngularJS中使用的表单验证功能【转】前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

@H_404_0@验证功能是AngularJS里面最酷炫的功能之一,它可以让你写出一个具有良好用户体验的Web应用。


@H_404_0@在AngularJS中,有许多用于验证的指令。我们将先学习几个最流行的内置指令,然后再创建一个自定义验证规则的指令。


<div class="cnblogs_code">

@H_502_9@ @H_404_0@AngularJS可以让我们轻松的处理客户端验证。虽然我们不能仅靠客户端验证来保证我们Web应用的安全性,但他们提供了良好用户体验。

@H_404_0@我们首先必须确保form上标签有一个name属性,像上面的例子一样。

@H_404_0@我们可以进行一些基本的验证,例如最小长度,最大长度,等等,这些都是HTML5自带属性验证功能

@H_404_0@Tips:通常需要在form标签加上novalidate属性,这样可以禁用浏览器自带的验证功能,从而使用AngularJS提供的。

@H_404_0@下面来看看我们可以在input中设置哪些验证:

必填

@H_404_0@验证是否已输入文字,只需在标签加上required

@H_502_9@

最小长度

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

@H_502_9@

最大长度

@H_404_0@验证至多输入{number}个字符,使用指令ng-maxlength=“{number}”:

@H_502_9@

正则匹配

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

@H_502_9@

Email

@H_404_0@验证输入是一个Email,设置input的type属性为email:

@H_502_9@

数字

@H_404_0@验证输入是一个数字,设置input的type属性为number:

@H_502_9@

Url

@H_404_0@验证输入是一个URL,设置input的type属性为url:

@H_502_9@

自定义验证

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

复制代码

@H_502_9@
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,false);
});
});
}
}
}]);


<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码">

<img src="/res/2019/03-06/23/51e409b11aa51c150090697429a953ed.gif" alt="复制代码">

@H_5029@
@H
502_9@

验证表单状态

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

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

formName.inputFieldName.property @H_502_9@

修改过的表单

@H_404_0@表示用户是否修改了表单。如果为ture,表示没有修改过:

formName.inputFieldName.$pristine; @H_502_9@

修改的表单

@H_404_0@当且用户是否已经修改过表单:

formName.inputFieldName.$dirty @H_502_9@

经过验证的表单

@H_404_0@表示否通过验证:

formName.inputFieldName.$valid @H_502_9@

未通过验证的表单

@H_404_0@表示否通过验证。如果表单当前没有通过验证,他将为true:

formName.inputFieldName.$invalid @H_502_9@ @H_404_0@最后两个属性在用于DOM元素的显示或隐藏时是特别有用的。当然,如果想要设置特定的class时,他们也是非常有用的。

错误

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

formName.inputfieldName.$error @H_502_9@ @H_404_0@如果验证失败,则此属性将是true的(因为length>0)。

控制验证时的样式

@H_404_0@当AngularJS处理的验证时,它将根据验证的状态增加一些特定的class属性

@H_404_0@这些class是:

.ng-pristine {} .ng-dirty {} .ng-valid {} .ng-invalid {} @H_502_9@ @H_404_0@这些class对应着其对应的验证对象的结果。

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

复制代码

@H_502_9@
input.ng-invalid {
  border: 1px solid red;
}
input.ng-valid {
  border: 1px solid green;
}
复制代码

@H_502_9@ @H_502_9@ @H_404_0@ 

全部放一起试试

@H_404_0@让我们编写一个注册表单。本申请表单将包括姓名,Email,以及用户名

@H_404_0@ 

@H_404_0@让我们定义一个form表单:

复制代码

@H_502_9@
Signup
<button type="submit" class="button radius"&gt;Submit</button>
复制代码

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

@H_404_0@现在,让我们添加用户的Name:

复制代码

@H_502_9@
@H_502_9@ @H_502_9@
复制代码

@H_502_9@ @H_502_9@ @H_404_0@ 我们增加了一个名字为name的输入框,并且将对象绑定在$scope对象的signup.name对象上(通过ng-model)。

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

@H_404_0@让我们用属性来控制显示还是隐藏错误信息。我们还将使用$dirty属性,以确保当用户没有输入字符前错误信息不会显示

复制代码

@H_502_9@
required"> Your name is required. required to be at least 3 characters @H_502_9@ @H_502_9@ @H_502_9@
复制代码

@H_502_9@ @H_502_9@
required" name="signup_form2">
在之前,当输入内容改变时它只能告诉我们我们输入是否有效。现在,我们将看到当那些没有通过的验证时的错误信息。@H_502_9@ @H_502_9@ @H_404_0@让我们接着看Email验证:

复制代码

@H_502_9@
required"> Your email is required. required to be at least 3 characters @H_502_9@ @H_502_9@ @H_502_9@
复制代码

@H_502_9@ @H_502_9@
required" name="signup_form3">
404_0@这一次,我们增加了Email字段。请注意,我们设置了input的type属性为email并且添加了$error.email错误信息。这是基于AngularJS的Email验证(使用了HTML5属性)。

@H_404_0@最后,让我们来看看在我们的最后一个验证,用户名

复制代码

@H_502_9@
required">Please input a username required to be at least 3 characters @H_502_9@ @H_502_9@
复制代码

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

复制代码

@H_502_9@
app.directive('ensureUnique',false);
        });
      });
    }
  }
}]);
复制代码

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

@H_404_0@ 

@H_404_0@ 

@H_404_0@ 

@H_404_0@更新: 

@H_404_0@根据评论,我加入了服务器超时检查。要查看完整的源代码,请点击

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