AngularJS 表单验证
AngularJS 可以验证输入数据。
表单验证
AngularJS 提供了客户端表单验证。
AngularJS 监控表单和输入字段(input、textarea、select)的状态,并让您通知用户当前状态。
AngularJS 还保存了关于它们是否被触碰、修改或未修改的信息。
您可以使用标准的 HTML5 属性来验证输入,也可以创建自己的验证函数。
单独的客户端验证不能保证用户输入的安全。 服务器端验证也是必要的。
必填
使用 HTML5 属性 required
指定输入字段必须填写
示例
输入字段是必填的
<form name="myForm">
<input name="myInput" ng-model="myInput" required>
</form>
<p>输入的有效状态是:</p>
<h1>{{myForm.myInput.$valid}}</h1>
亲自试一试 »
电子邮件
使用 HTML5 类型 email
指定值必须是电子邮件
示例
输入字段必须是电子邮件
<form name="myForm">
<input name="myInput" ng-model="myInput" type="email">
</form>
<p>输入的有效状态是:</p>
<h1>{{myForm.myInput.$valid}}</h1>
亲自试一试 »
表单状态和输入状态
AngularJS 不断更新表单和输入字段的状态。
输入字段具有以下状态
$untouched
该字段尚未被触碰$touched
该字段已被触碰$pristine
该字段尚未被修改$dirty
该字段已被修改$invalid
字段内容无效$valid
字段内容有效
它们都是输入字段的属性,并且要么是 true
要么是 false
。
表单具有以下状态
$pristine
尚未修改任何字段$dirty
一个或多个字段已被修改$invalid
表单内容无效$valid
表单内容有效$submitted
表单已提交
它们都是表单的属性,并且要么是 true
要么是 false
。
您可以使用这些状态向用户显示有意义的消息。 例如,如果一个字段是必填的,而用户将其留空,您应该向用户发出警告
示例
如果字段已被触碰并且为空,则显示错误消息
<input name="myName" ng-model="myName" required>
<span ng-show="myForm.myName.$touched && myForm.myName.$invalid">姓名是必填项。</span>
亲自试一试 »
CSS 类
AngularJS 根据表单和输入字段的状态向其添加 CSS 类。
以下类将被添加到输入字段或从输入字段中删除
ng-untouched
该字段尚未被触碰ng-touched
该字段已被触碰ng-pristine
该字段尚未被修改ng-dirty
该字段已被修改ng-valid
字段内容有效ng-invalid
字段内容无效ng-valid-key
每个验证一个 key。 例如:ng-valid-required
,当有多个需要验证的项目时很有用ng-invalid-key
例如:ng-invalid-required
以下类将被添加到表单或从表单中删除
ng-pristine
尚未修改任何字段ng-dirty
一个或多个字段已被修改ng-valid
表单内容有效ng-invalid
表单内容无效ng-valid-key
每个验证一个 key。 例如:ng-valid-required
,当有多个需要验证的项目时很有用ng-invalid-key
例如:ng-invalid-required
如果它们所代表的值为 false
,则这些类将被删除。
添加这些类的样式,为您的应用程序提供更好、更直观的用户界面。
示例
使用标准 CSS 应用样式
<style>
input.ng-invalid {
background-color: pink;
}
input.ng-valid {
background-color: lightgreen;
}
</style>
亲自试一试 »
表单也可以进行样式设置
示例
为未修改(原始)的表单和修改后的表单应用样式
<style>
form.ng-pristine {
background-color: lightblue;
}
form.ng-dirty {
background-color: pink;
}
</style>
亲自试一试 »
自定义验证
要创建您自己的验证函数稍微复杂一些; 您需要将一个新的指令添加到您的应用程序中,并在具有特定指定参数的函数中处理验证。
示例
创建您自己的指令,其中包含一个自定义验证函数,并使用 my-directive
引用它。
只有当值包含字符“e”时,该字段才有效
<form name="myForm">
<input name="myInput" ng-model="myInput" required my-directive>
</form>
<script>
var app = angular.module('myApp', []);
app.directive('myDirective', function() {
return {
require: 'ngModel',
link: function(scope, element, attr, mCtrl) {
function myValidation(value) {
if (value.indexOf("e") > -1) {
mCtrl.$setValidity('charE', true);
} else {
mCtrl.$setValidity('charE', false);
}
return value;
}
mCtrl.$parsers.push(myValidation);
}
};
});
</script>
亲自试一试 »
示例说明
在 HTML 中,将使用属性 my-directive
引用新指令。
在 JavaScript 中,我们首先添加一个名为 myDirective
的新指令。
请记住,在命名指令时,必须使用驼峰命名法, myDirective
,但在调用它时,必须使用 -
分隔的名称,my-directive
。
然后,返回一个对象,在其中指定我们需要的 ngModel
,即 ngModelController。
创建一个链接函数,它接受一些参数,其中第四个参数,mCtrl
,是 ngModelController
,
然后指定一个函数,在本例中命名为 myValidation
,它接受一个参数,该参数是输入元素的值。
测试值是否包含字母“e”,并将模型控制器的有效性设置为 true
或 false
。
最后,mCtrl.$parsers.push(myValidation);
将 myValidation
函数添加到其他函数的数组中,该数组将在每次输入值更改时执行。
验证示例
<!DOCTYPE html>
<html>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></script>
<body>
<h2>验证示例</h2>
<form ng-app="myApp" ng-controller="validateCtrl"
name="myForm" novalidate>
<p>用户名:<br>
<input type="text" name="user" ng-model="user" required>
<span style="color:red" ng-show="myForm.user.$dirty && myForm.user.$invalid">
<span ng-show="myForm.user.$error.required">用户名是必填项。</span>
</span>
</p>
<p>电子邮件:<br>
<input type="email" name="email" ng-model="email" required>
<span style="color:red" ng-show="myForm.email.$dirty && myForm.email.$invalid">
<span ng-show="myForm.email.$error.required">电子邮件是必填项。</span>
<span ng-show="myForm.email.$error.email">无效的电子邮件地址。</span>
</span>
</p>
<p>
<input type="submit"
ng-disabled="myForm.user.$dirty && myForm.user.$invalid ||
myForm.email.$dirty && myForm.email.$invalid">
</p>
</form>
<script>
var app = angular.module('myApp', []);
app.controller('validateCtrl', function($scope) {
$scope.user = 'John Doe';
$scope.email = '[email protected]';
});
</script>
</body>
</html>
亲自试一试 »
HTML 表单属性 novalidate 用于禁用默认的浏览器验证。
示例说明
AngularJS 指令 ng-model 将输入元素绑定到模型。
模型对象有两个属性:user 和 email。
由于 ng-show,只有当 user 或 email 为 $dirty 且 $invalid 时,才会显示带有 color:red 的跨度。