angular4提供了两种方式来处理表单。模板式表单适合处理比较简单和常规的表单;响应式表单适合应付比较复杂的表单…
模板式表单
麻雀一览
1 | <!-- 表单元素要被包裹在ngForm属性里边,通过模版局部变量,可以拿到表单中的所有数据 --> |
响应式表单
名词解释
FormControl: 表单模版的基本单位
FormGroup: 整个表单或者表单的一个固定的子集
FormArray: 多个同类型的数据组成的数组
代码实例
1 | formModel: FormGroup |
1 | // 使用formBuilder来简化代码('[]'里面可以有三个元素,分别为默认值、校验、异步校验) |
1 | <form [formGroup]="formModel" (ngSubmit)="onSubmit()"> |
表单校验
angular自带校验器
不用定义,直接可用:required、minlength、maxlength、pattern1
2
3
4
5
6
7
8
9
10constructor(fb: formBuilder) {
this.fromModel = fb.group({
userName: ['',[Validators.required,Validators.minLength(6)]]
})
}
onSubmit() {
let isValid: boolean = this.formModel.get('userName').Validators
// 这里拿到的是一个对象(没有错误时返回的null)
let errors: any = this.formModel.get('userName').errors
}
自定义校验
1 | constructor(fb: formBuilder) { |
表单状态字段
touched和untouched: 有没有获取过焦点
pristine和dirty: 有值被改变,就会变为dirty
pending: 正处于异步校验的状态1
2
3
4
5
6<!-- 校验不通过时显示的提示信息 -->
<div [hidden]="formModel.get('userName').valid || formModel.get('userName').untouched">校验不通过!</div>
<!-- 注意用error的话要取反的 -->
<div [hidden]="!formModel.hasError('required','userName') || formModel.get('userName').pristine">必填项!</div>
<!-- 异步校验提示信息 -->
<div [hidden]="!formModel.get('mobile').pending">正在校验手机号合法性!</div>
表单元素的动态class
初始状态:ng-untouched ng-pristine ng-invalid
其他状态:ng-dirty ng-touched ng-valid
注意:这些class都是全局的,自定义的时候要防止误伤。1
2<!-- 验证不通过的表单元素加红边框 -->
<input [class.hasError]="formModel.get('userName').invalid && fromModel.get('userName').touched"/>