表单是一系列输入控件的集合,客户端验证表单可以提供更好的用户体验.
<form></from>
<ng-form></ng-from>
经过实践,最好用第二种。第一种会自动绑定的提交动作。
Simple from
novalidate 禁用 HTML5 浏览器原生表单验证
添加 CSS 样式
ngModel
会添加以下 CSS classes:
ng-valid
: the model is valid
ng-invalid
: the model is invalid
ng-valid-[key]
: for each valid key added by $setValidity
ng-invalid-[key]
: for each invalid key added by $setValidity
ng-pristine
: the control hasn’t been interacted with yet
ng-dirty
: the control has been interacted with
ng-touched
: the control has been blurred
ng-untouched
: the control hasn’t been blurred
ng-pending
: any $asyncValidators are unfulfilled
一个 form 是 FromController
的实例. 这个实例可以用 name
属性引用.
同样地, ng-model
指令也会为 input
产生一个 NgModelController
实例, 也同样用 name
属性引用.
我们就能够在试图内部引用他们的状态, 实现一些新的特性:
- 显示用户定制化的错误信息(
$touched
被激活后显示)
- 提交表单时显示用户定制化错误信息(
$submmit
被激活后显示)
定制模板更新的触发时机
默认表单中任何内容的改变都会触发 model
更新并验证表单.
可以用 ngModelOptions
指令去指定某些事件可以触发 model
更新并验证表单.
只在失去焦点时更新 ng-model-options="{ updateOn: 'blur' }"
按下鼠标和失去焦点时更新 ng-model-options="{ updateOn: 'mousedown blur' }"
在默认事件基础上添加失去焦点时 ng-model-options="{ updateOn: 'default blur' }"
不及时更新模板(防抖动)
延迟模板 更新/验证 ,在 ngModelOptions
指令中添加 debounce
关键字.这种延迟也适用于解析,验证,以及 model 的一些标识,比如 $dirty
$pristine
.
每隔 500 毫秒验证一次: ng-model-options="{ debounce: 500 }"
用户还可以特别指定一些事件的触发验证时间间隔,比如(失去焦点就马上验证,否则就每隔 500 毫秒验证一次):
ng-model-options="{ updateOn: 'default blur', debounce: { default: 500, blur: 0 } }"
这些属性都是会被子元素继承的.
验证数据
angular 已经提供的验证机制
HTML5 input types : (text, number, url, email, date, radio, checkbox)
验证指令 (required, pattern, minlength, maxlength, min, max)
ng默认提供以下状态
$valid
: 验证通过 $invalid
: 验证未通过
$pristine
:还没有交互 $dirty
: 已经有交互
$error
: 错误状态
angular 自带的一些属性验证和相对应的验证状态有:
ng-required="..." ngModel.$error.required
ng-minlength="number" ngModel.$error.minlength
ng-maxlength="number" ngModel.$error.maxlength
ng-min="number" ngModel.$error.min
ng-max="number" ngModel.$error.max
ng-pattern="pattern" ngModel.$error.pattern
表单元素类型验证,angular 表单定义类型和所对应验证状态有:
type="email" ngModel.$error.email
type="url" ngModel.$error.url
type="number" ngModel.$error.number
type="date" ngModel.$error.date
type="time" ngModel.$error.time
type="datetime" ngModel.$error.datetimelocal
type="week" ngModel.$error.week
type="month" ngModel.$error.month
表单验证未通过,禁用提交按钮
定制化的验证
你可以把你的验证函数加在 ngModelController
的 $validators
对象上,
需要自定义指令
$validators
这个对象的每个函数都会接收两个参数 modelValue
viewValue
,
Angular 会根据函数的返回值在内部调用 $setValidity
(true: valid, false: invalid).
验证函数会在 每次输入改变($setViewValue
被调用的时候), 或者绑定的 model 改变的时候 执行.
Validation happens after successfully running $parsers and $formatters, respectively.
失败的验证结果会根据 key 值存储在 ngModelController.$error
.
另外, 还有 $asyncValidators
对象可以处理异步验证, 比如用 $http
请求在后台验证.
这种验证函数必须返回一个 promise
, 在 验证通过时执行 resolve()
,验证未通过时执行 reject()
.
一步请求验证结果根据 key 值储存在 ngModelController.$pending
.
修改 angular 已有的验证
Angular 的验证机制是使用 control 的$validators
, 我们可以用修改它本身的验证机制,
下面的例子也可以使用 ng-pattern
来完成更严格的匹配.
实现用户自定义表单
你可以重写你自己的表单, form control
注意 要使 自定义的 control 也能够根据 ngModel
指令实现双向数据绑定,你需要做:
参考:
-
Angular Form 文档
-
http://ajiegao.com/2014/11/27/Angularjs-form-1/