AngularJS 表单验证
AngularJS 可以验证输入数据。
表单验证
AngularJS 提供客户端表单验证。
AngularJS 监视表单和输入字段(输入、文本区域、选择)的状态,并允许您通知用户当前状态。
AngularJS 还保存了关于它们是否被触摸、修改或未被修改的信息。
您可以使用标准 HTML5 属性来验证输入,也可以创建自己的验证函数。
客户端验证无法单独保护用户输入。服务器端验证也是必要的。
必填
使用 HTML5 属性 required
指定必须填写输入字段:
实例
必填输入字段:
<!DOCTYPE html>
<html>
<script src="https://cdn.bootcdn.net/ajax/libs/angular.js/1.8.2/angular.min.js"></script>
<body ng-app="">
<p>尝试在输入字段中写入:</p>
<form name="myForm">
<input name="myInput" ng-model="myInput" required="">
</form>
<p>输入的有效状态为:</p>
<h2>{{myForm.myInput.$valid}}</h2>
</body>
</html>
使用 HTML5 类型 email
指定值必须是 E-mail 格式:
实例
输入字段必须是电子邮件:
<!DOCTYPE html>
<html>
<script src="https://cdn.bootcdn.net/ajax/libs/angular.js/1.8.2/angular.min.js"></script>
<body ng-app="">
<p>尝试在输入字段中写入电子邮件地址:</p>
<form name="myForm">
<input type="email" name="myInput" ng-model="myInput">
</form>
<p>输入的有效状态为:</p>
<h2>{{myForm.myInput.$valid}}</h2>
<p>请注意,在开始写入之前,输入字段的状态为 "true",即使它不包含电子邮件地址。</p>
</body>
</html>
表单状态和输入状态
AngularJS 不断更新表单和输入字段的状态。
输入字段具有以下状态:
- $untouched 这个字段没有被触发过
- $touched 这个字段已经被触发过
- $pristine 这个字段还没有被修改过
- $dirty 这个字段已经被修改
- $invalid 这个字段内容不合法
- $valid 这个字段内容合法
它们都是输入字段的属性,不是 true
就是 false
.
表单都有以下状态:
- $pristine 尚未修改任何字段
- $dirty 一个或多个已修改
- $invalid 表单内容不合法
- $valid 表单内容合法
- $submitted 表单已提交
它们都是表单的属性,不是 true
就是 false
。
可以使用这些状态向用户显示有意义的消息。例如,如果某个字段是必填字段,而用户将其留空,则应向用户发出警告:
实例
如果字段已被触及且为空,则显示错误消息:
<!DOCTYPE html>
<html>
<script src="https://cdn.bootcdn.net/ajax/libs/angular.js/1.8.2/angular.min.js"></script>
<body ng-app="">
<p>尝试将第一个输入字段留空:</p>
<form name="myForm">
<p>名称:
<input name="myName" ng-model="myName" required="">
<span ng-show="myForm.myName.$touched && myForm.myName.$invalid">名称是必填的</span>
</p>
<p>地址:
<input name="myAddress" ng-model="myAddress" required="">
</p>
</form>
<p>我们使用 ng-show 指令仅在字段已被触及且为空时显示错误消息。</p>
</body>
</html>
CSS 样式表
AngularJS 根据表单和输入字段的状态向其添加 CSS 样式表。
在输入字段中添加或删除以下 CSS:
- ng-untouched 字段未被触及
- ng-touched 字段已被触及
- ng-pristine 字段尚未修改
- ng-dirty 字段已修改
- ng-valid 字段内容合法
- ng-invalid 字段内容不合法
- ng-valid-key 每次验证一个键。示例:ng-valid-required,在需要验证多个内容时非常有用
- ng-invalid-key 示例: ng-invalid-required
以下类被添加到表单或从表单中删除:
- ng-pristine 尚未修改任何字段
- ng-dirty 一个或多个字段已被修改
- ng-valid 表单内容有效
- ng-invalid 表单内容无效
- ng-valid-key 每次验证一个键。示例:ng-valid-required,在需要验证多个内容时非常有用
- ng-invalid-key 示例: ng-invalid-required
如果类所表示的值为 false
,则会删除这些类。
为这些类添加样式,为应用程序提供更好、更直观的用户界面。
实例
使用标准 CSS 应用样式:
<!DOCTYPE html>
<html>
<script src="https://cdn.bootcdn.net/ajax/libs/angular.js/1.8.2/angular.min.js"></script>
<style>
input.ng-invalid {
background-color:pink;
}
input.ng-valid {
background-color:lightgreen;
}
</style>
<body ng-app="">
<p>尝试在输入字段中写入:</p>
<form name="myForm">
<input name="myName" ng-model="myName" required="">
</form>
<p>输入字段需要内容,因此在写入时将变为绿色。</p>
</body>
</html>
表单也可以设置样式:
实例
将样式应用于未修改(原始)表单和已修改表单:
<!DOCTYPE html>
<html>
<script src="https://cdn.bootcdn.net/ajax/libs/angular.js/1.8.2/angular.min.js"></script>
<style>
form.ng-pristine {
background-color:lightblue;
}
form.ng-dirty {
background-color:pink;
}
</style>
<body ng-app="">
<form name="myForm">
<p>尝试在输入字段中写入:</p>
<input name="myName" ng-model="myName" required="">
<p>当表单被修改时,表单会得到一个 "ng-dirty" 类,因此会变成粉红色。</p>
</form>
</body>
</html>
自定义验证
创建自己的验证函数有点棘手;您必须向应用程序中添加一个新指令,并在具有特定参数的函数中处理验证。
实例
创建自己的指令,其中包含一个自定义验证函数,并使用 my-directive
引用它。
仅当值包含字符 "e" 时,该字段才有效:
<!DOCTYPE html>
<html>
<script src="https://cdn.bootcdn.net/ajax/libs/angular.js/1.8.2/angular.min.js"></script>
<body ng-app="myApp">
<p>尝试在输入字段中写入:</p>
<form name="myForm">
<input name="myInput" ng-model="myInput" required="" my-directive="">
</form>
<p>输入的有效状态为:</p>
<h1>{{myForm.myInput.$valid}}</h1>
<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>
<p>输入字段必须包含要考虑有效的字符 "e"。</p>
</body>
</html>
实例解释:
在 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://cdn.bootcdn.net/ajax/libs/angular.js/1.8.2/angular.min.js"></script>
<body>
<h2>验证实例</h2>
<form ng-app="myApp" ng-controller="validateCtrl" name="myForm" novalidate="">
<p>Username:<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">Username is required.</span>
</span>
</p>
<p>Email:<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">有效 Email</span>
<span ng-show="myForm.email.$error.email">无效 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 = 'john.doe@gmail.com';
});
</script>
</body>
</html>
HTML 表单属性 novalidate 用于禁用默认浏览器验证。
实例解释
AngularJS 指令 ng-model 将输入元素绑定到模型。
模型对象有两个属性: user 和 email.
由于 ng-show, 只有当用户或电子邮件为 $dirty 和 $invalid 时,才会显示颜色为红色的 sapns。