angular组验证器
前言
我们在对表单进行验证时,有时需要对多个字段同时进行验证,对不同字段的值进行比较,并针对它们的组合判断是否验证通过,在这种情况下使用对单一字段进行验证的验证器难以实现,这个时候就需要用到组验证器,在官方文档也叫跨字段交叉验证器。
组验证器的使用
官方文档链接
组验证器使用示例
下面通过项目中的实例讲解组验证器的用法。
当前项目中需要对是否接种疫苗,接种地点,未接种原因三个字段进行验证,如果接种疫苗,需填写接种地点(必填),否则填写未接种原因(非必填)。
1.为FormGroup添加组验证器
注意:要想在单个自定义验证器中计算这三个控件,你就必须在它们共同的祖先控件中执行验证: FormGroup
可以在新建FormGroup时直接添加验证器,在创建时把一个新的验证器传给它的第二个参数
formGroup = new FormGroup({
'beVaccinated': new FormControl(),
'vaccinatedPlace': new FormControl(),
'notVaccinatedReason': new FormControl()
},{validators: VaccinatedValidator});
当然,通常我们在写的时候不会在新建FormGroup的时候添加参数,
而是使用下面的方式添加验证器
formGroup.setValidators(VaccinatedValidator);
添加完验证器后我们开始完成验证器的功能,这样就可以对formGroup中的值进行验证了
2.自定义组验证器 验证器代码如下
import {AbstractControl, ValidationErrors, ValidatorFn} from '@angular/forms';
/**
* 跨字段交叉验证器
* 同时验证接种疫苗和 地点 原因 三个字段
* 如果接种,地点必填,只有填写地点才能验证通过,返回null
* 未接种,地点不必填,直接返回null
* @param control 需要验证的 formGroup
*/
export const VaccinatedValidator: ValidatorFn = (control: AbstractControl): ValidationErrors | null => {
const beVaccinated = control.get('beVaccinated');
const vaccinatedPlace = control.get('vaccinatedPlace');
const notVaccinatedReason = control.get('notVaccinatedReason');
// 判断是否传值
if (beVaccinated === null || vaccinatedPlace === null || notVaccinatedReason === null) {
return {vaccinated: true};
}
return (beVaccinated.value as boolean && vaccinatedPlace.value as string) || !beVaccinated.value as boolean ? null : {vaccinated: true};
};
这个验证器实现了 ValidatorFn 接口。它接收一个 Angular 表单控件对象作为参数,control即为当前验证的FormGroup,通过control.get('')的方式获取formGroup中的相应的formControl,这样就可以根据需要自己对其中的值进行验证。
如果验证信息有效,返回null,否则返回ValidationErrors,也就是{vaccinated: true},其中的名称'vaccinated'和'true'可以根据需要自己定义。
注意:为避免没有传入相应FormControl,需要对使用get方法获取到的FormControl进行判断,如果为空直接返回ValidationErrors
3.在v层显示错误信息 如果有时需要根据验证器返回的错误信息向用户显示相应信息,可以通过以下方法
信息错误
这样当出现错误时可以给用户很好的提示
总结
【angular组验证器】组验证器简单来说就是自定义一个验证器,并添加到FormGroup中,在验证器中对多个值同时进行验证,注意在定义验证器是对传值是否为空判断
推荐阅读
- angular2内置管道
- 数组常用方法一
- 试论化院的学生自组织
- D034+3组苏曼+《写作这回事》读书笔记
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- python青少年编程比赛_第十一届蓝桥杯大赛青少年创意编程组比赛细则
- Java|Java基础——数组
- 学员+3组杨子涓+202002RIA训练营W3D2+苏格拉底提问法
- 幸福2.0六组90天践行总纲指导方针
- 组织绩效V.S个人绩效