最近在写项目的时候,产品要求对表单的必填输入项进行友好的校验提示,效果如图:
“ 这个需求很简单,怎么实现我不管。 “ ,还能说什么,就是干,具体实现如下:
对Angular内置的表单css属性设置想要的样式
1
// css样式
2
.isvalid {
3
border: 1px dashed red ;
4
}
html文件里设置即时样式检测
[class.isvalid]
1
<!--非formArray-->
2
<input formControlName="addressName [class.isvalid]="isFieldInvalidTouched('addressName')" type="text" placeholder="请输入收件人姓名">
3
<!--formArray-->
4
<input formControlName="addressName [class.isvalid]="isArrayFieldInvalidTouched(i, 'addressName')" type="text" placeholder="请输入收件人姓名">
ts文件里注入核心方法
1
// 表单字段校验
2
validateAllFormFields(formGroup: any) {
3
Object.keys(formGroup.controls).forEach(field => {
4
const control = formGroup.get(field);
5
if (control instanceof FormControl) {
6
control.markAsTouched({ onlySelf: true });
7
} else if (control instanceof FormGroup) {
8
this.validateAllFormFields(control);
9
} else if (control instanceof FormArray) {
10
this.validateAllFormFields(control);
11
}
12
});
13
}
14
15
// 表单控件校验
16
isFieldInvalidTouched(field: any) {
17
return this.form.get(field).invalid && this.form.get(field).touched;
18
}
19
20
// 表单控件校验
21
isArrayFieldInvalidTouched(index, field: any) {
22
return this.xxxArray.controls[index].get(field).invalid &&this.xxxArray.controls[index].get(field).touched;
23
}
24
25
// 获取FormArray
26
get xxxArray(): FormArray {
27
return this.form.get('xxxArray') as FormArray;
28
}
29
30
// 设置FormArray
31
set setXxxArray() {
32
// TODO
33
}
34
35
// 表单提交
36
ensure() {
37
if (!this.form.valid) {
38
this.validateAllFormFields(this.form);
39
this.orderService.presentToast('表单信息不全, 请填写完整~');
40
} else {
41
// TODO
42
}
43
}