创建自定义验证
validationRange(min:string,max:string){
return (control:AbstractControl)=>{
if (control.value)
{
const minInt=+(min.replace(/\D/gi,""))
const maxInt=+(max.replace(/\D/gi,""))
const valueInt=+(control.value.replace(/\D/gi,""))
return valueInt>=minInt && valueInt<=maxInt?null:{range:"not in range"}
}
}
}
//you use
control=new FormControl(null,this.validationRange("123-01N3W","123-01N97W")
如果您希望最小值和最大值不固定 (*),例如是来自同一个formGroup中的其他formControls你可以
//your form is like
form=new FormGroup({
min:new FormControl(null),
max:new FormControl(null),
value:new FormControl(null,this.validationRange())
})
validationRange(){
return (control:AbstractControl)=>{
const form=(control.parent as FormGroup)
if (form && control.value){
const ctrlMax=form.get('max');
const ctrlMin=form.get('min');
if (ctrlMax && ctrlMin && ctrMax.value && ctrMin.value)
{
const ctrMin.value=+(min.replace(/\D/gi,""))
const ctrMax.value=+(max.replace(/\D/gi,""))
const valueInt=+(control.value.replace(/\D/gi,""))
return valueInt>=minInt && valueInt<=maxInt?null:{range:"not in range"}
}
}
}
}
但请记住,当更改“min”和“max”时会产生一个
this.form.get('value').updateValueAndValidity()
例如在(模糊)事件中
<form formGroup]="form">
<input formControlName="min" (blur)="form.get('value').updateValueAndValidity()">
<input formControlName="min" (blur)="form.get('value').updateValueAndValidity()">
<input formControlName="value" >
</form>
(*) 当我们创建一个依赖于变量的自定义表单验证时,我们需要考虑到得到的值是变量的“实际”值。因此,如果这个变量来自对 API 的调用,我们需要在获取值后进行 setValidation