Angular 提供了一些内建的 validators,在表单中使用它们。
目前 Angular 支持的内建 validators 如下:
required - 设置表单控件值是非空的。
email - 设置表单控件值的格式是 email。
minlength - 设置表单控件值的最小长度。
maxlength - 设置表单控件值的最大长度。
pattern - 设置表单控件的值需匹配 pattern 对应的模式。
this.formModel=this.fb.group({
nickname:['',[Validators.required,Validators.minLength(6)]], //使用内置校验器
});
//[1]根据模型对象的valid属性判断当前对象是否合法
let nicknameValid=this.formModel.get("nickname").valid;
console.log("nickname是否校验通过"+nicknameValid);
//[2]通过模型对象的errors属性获得校验错误信息
let nicknameErrors=this.formModel.get("nickname").errors;
console.log("nickname的校验信息"+JSON.stringify(nicknameErrors));
//自定义校验器
XXX(param:AbstractControl):{[key:string]:any}{
//AbstractControl是FormControl,FormGroup,FormArray的父类,也就是说方法的参数是三个里面的任意一个类型的对象
return null;
}
##1单字段校验 -自定义手机号校验器:
mobileValidator(mobile:FormControl):any{
let value=(mobile.value||'')+'';
let regx=/^1[3|4|5|8][0-9]\d{4,8}$/;
if(!regx.test(value)){
console.log({'mobile校验器是否通过':true});
return {'mobile':true};
}else{
console.log({'mobile校验器是否通过':false});
return null;
}
}
在模型对象中使用上述的手机号校验器:
this.formModel=this.fb.group({
nickname:['',[Validators.required,Validators.minLength(6)]],
mobile:['',this.mobileValidator], //使用自定义的校验器
});
##2 校验多个字段,比如password,confirmPassword
校验器声明:
passwordValidator(info:FormGroup){
let password:FormControl=info.get('password') as FormControl;
let confirmPassword:FormControl=info.get('confirmPassword') as FormControl;
if(password.value!==confirmPassword.value){
return {"password":true};
}else{
return null;
}
}
校验器使用:
this.formModel=this.fb.group({
nickname:['',[Validators.required,Validators.minLength(6)]],
mobile:['',this.mobileValidator],
passwordInfo:this.fb.group({
password:[''],
confirmPassword:[''],
},this.passwordValidator),
});
##3将自定义校验器独立出去,新建validators/validators.ts,内容如下
import { FormGroup, FormControl } from "@angular/forms";
export function passwordValidator(info:FormGroup){
let password:FormControl=info.get('password') as FormControl;
let confirmPassword:FormControl=info.get('confirmPassword') as FormControl;
if(password.value!==confirmPassword.value){
return {"password":true};
}else{
return null;
}
}
export function mobileValidator(mobile:FormControl):any{
let value=(mobile.value||'')+'';
let regx=/^1[3|4|5|8][0-9]\d{4,8}$/;
if(!regx.test(value)){
return {'mobile':true};
}else{
return null;
}
}
如何在组件中使用公共校验器:
import {mobileValidator,passwordValidator} from '../validators/validators';
this.formModel=this.fb.group({
nickname:['',[Validators.required,Validators.minLength(6)]],
mobile:['',mobileValidator],
passwordInfo:this.fb.group({
password:[''],
confirmPassword:[''],
},{validator:passwordValidator}),
emails:this.fb.array([
[''],
]),
});
##4 判断整个表单数据是否合法
//通过formModel的valid属性来判断表单中所有字段是否合法
if(this.formModel.valid){
console.log(this.formModel.value);
}
##2 具体错误信息由校验器来决定
校验器:
export function passwordValidator(info:FormGroup):any{
let password:FormControl=info.get('password') as FormControl;
let confirmPassword:FormControl=info.get('confirmPassword') as FormControl;
if(password.value===confirmPassword.value){
return null;
}else{
return {"password":{description:"密码与确认密码不一致"}};
}
}
使用:
密码
确认密码
密码是必填项
{{formModel.getError('password','passwordInfo')?.description}}
4.异步校验器,返回可观测的流,同步校验满足之后才回调异步校验
校验器:
export function mobileasyncValidator(mobile:FormControl):any{
let value=(mobile.value||'')+'';
let regx=/^1[3|4|5|8][0-9]\d{4,8}$/;
if(!regx.test(value)){
//延迟5s返回数据,模拟调用远程服务的行为
return Observable.of({'mobile':true}).delay(50000);
}else{
return Observable.of(null).delay(5000);
}
}
数据模型中校验器的使用:
this.formModel=this.fb.group({
mobile:['',mobileValidator,mobileasyncValidator], //['默认值',同步校验器,异步校验器]
});
{{formModel.status}}