不要在調(diào)用驗(yàn)證方法時(shí)保存數(shù)據(jù)
- this.formData.controls[i].markAsDirty();
- this.formData.controls[i].updateValueAndValidity();
for (const i in this.formData.controls) {
console.log(i, this.formData.controls[i].valid, this.formData.get(i).errors ); // 異步之前 valid 值 等于 true
this.formData.controls[i].markAsDirty();
this.formData.controls[i].updateValueAndValidity();
console.log(i, this.formData.controls[i].valid, this.formData.get(i).errors ); // 異步之后 valid 值 等于 true
}
// 如果你有異步驗(yàn)證督禽,這個(gè)this.formData.valid值永遠(yuǎn)是false
if (!this.formData.valid ) {
this.message.error('數(shù)據(jù)填寫(xiě)有誤?苈奈懒!');
return;
}
自定義異步驗(yàn)證方法
export function nameRepetition(db: DbService): AsyncValidatorFn {
return (control: AbstractControl): Observable<ValidationErrors | null> => {
// 獲取這個(gè) form的值 這里
const value = control.root.value;
return control.valueChanges.pipe(
// 延時(shí)防抖
debounceTime(400),
// 異步驗(yàn)證具體請(qǐng)求
switchMap(() => db.repetitionAsync(name, (o: any) => f.id !== value.id && f.name === control.value )),
map(c => {
console.log(c);
return c > 0 ? { reperition: `${control.value} 已存在!!` } : null;
}),
// 每次驗(yàn)證的結(jié)果是唯一的,截?cái)嗔? first()
);
};
}
export function nameRepetition(
db: DbService,
name: string,
f: (o1: any, o2: any) => boolean = (o1: any, o2: any) => o1.name === o2.name && o1.id !== o2.id,
nowkey: string = 'name'): AsyncValidatorFn {
return (control: AbstractControl): Observable<ValidationErrors | null> => {
const value = control.root.value;
// 這里我要重新賦值船惨,不然拿到的不是最新的值,(我不清楚為什么,有知道留言告訴我謝謝) control.value這個(gè)是最新的值本涕,control.root.value的值不是最新的值
// nowkey 就是異步驗(yàn)證字段
value[nowkey] = control.value;
return control.valueChanges.pipe(
// 延時(shí)防抖
debounceTime(400),
switchMap(() => db.repetitionAsync(name, (o: any) => f(o, value))),
map(c => {
console.log(c);
return c > 0 ? { reperition: `${control.value} 已存在!!` } : null;
}),
// 每次驗(yàn)證的結(jié)果是唯一的操漠,截?cái)嗔? first()
);
};
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者