angular - 异步验证器导致表单状态保持 PENDING
问题描述
编辑: switchmap 似乎是罪魁祸首。删除它时,我的表单状态不再停留在待处理状态。谁能解释一下?
我正在使用以下工厂为我的表单创建异步验证器:
export function createAsyncValidator(checkFn: (value: string) => Observable<Boolean>, errorMessage: string) {
return (control: AbstractControl): Observable<ValidationErrors> => {
return Observable.timer(500).switchMap(() => {
return checkFn(control.value)
.map(result => {
return result ? null : { [errorMessage]: true };
});
});
};
}
我将它添加到我的表单中,如下所示:
createAsyncValidator(this.asyncValidator, 'Error')
验证器的实现(示例):
asyncValidator = (value: string): Observable<Boolean> => {
if (value === 'test') {
return Observable.of(true); // THIS CAUSES THE FORM TO BE PENDING
}
return this.http.get('url/' + value, true); // THIS WORKS
};
当我的异步验证器使用http 调用来验证我的输入时,一切都按预期工作。但是,如果我返回Observable.of(true),整个表单将停留在 PENDING
经过一些研究,我发现我的 Observable 不完整,因此状态为 PENDING。我怎样才能返回一个完成的可观察对象?
解决方案
用flatMap替换 switchMap 可以解决我的问题:
export function createAsyncValidator(checkFn: (value: string) => Observable<Boolean>, errorMessage: string) {
return (control: AbstractControl): Observable<ValidationErrors> => {
return Observable.timer(500).flatMap(() => {
return checkFn(control.value)
.map(result => {
return result ? null : { [errorMessage]: true };
});
});
};
}
推荐阅读
- spring-boot - JWT 令牌安全
- javascript - 协助创建动态菜单弹出窗口 -js
- android - 如何将数据树的数据存储在 Firebase 中?对于安卓工作室项目
- android - 在按钮上单击从图库中选择图像并在另一个活动的 imageView 中设置
- ckeditor - 在 onchange 事件期间调用 setData 的 Ckeditor 问题
- php - 用 php 更新 html 表单
- python - 没有 spark-submit 的 Exec pyspark 独立脚本
- python - python - 如何在python中为常规数组和python查找数组中的最后一个元素?
- tensorflow - SSD对象检测中的锚框和偏移量
- java - 如何通过imageview为网格视图设置事件