【发布时间】:2020-10-21 11:09:46
【问题描述】:
我在一个 Angular 项目中,我使用的是反应形式。我想要做的是添加我自己的验证器。为此,我需要检查 id 是否存在于数据库中。出于这个原因,我使用了一个异步验证器。如果 id 已经被另一个元素使用,那么它必须返回一个错误。否则,表格将有效。
这是验证器。
export class ValidadorOperationId {
static createValidatorOperationId(name, operationListService: OperationsListService, time: number = 500): AsyncValidatorFn {
return (control: AbstractControl): Observable<ValidationErrors> => {
return timer(time).pipe(
switchMap(() => operationListService.getOperationsByUuid(name, control.value)),
map(res => {
return res ? { operationIdExist: true } : null
}
)
);
};
}
}
这就是我在组件中调用验证器的方式。
this.fb.group({
value: [this.operationDetails['operationid'], [Validators.required], ValidadorOperationId.createValidatorOperationId(this.nombre,this.operationListService)]
})
问题是控件有status: pending,不知道怎么回事。
如果您需要更多代码,尽管问我。
谁能帮帮我?
- Angular 版本:8.2.14
- Rxjs 版本:6.5.3
2020 年 10 月 22 日更新
我已检查status:pending 仅在服务未返回任何内容时出现(错误 404)
【问题讨论】:
-
不应该将异步验证器也添加到数组中吗?
value: [this.operationDetails['operationid'], [Validators.required], [ValidadorOperationId.createValidatorOperationId(this.nombre,this.operationListService)]] -
结果是一样的。状态继续挂起。 @MoxxiManagarm
-
你可以创建一个显示相同行为的堆栈闪电战吗?
-
我认为,为了工作,你的 observable 应该完成。您的
getOperationsByUuid方法是否完整?在您的地图运算符后面添加take(1),看看它是否解决了。
标签: angular asynchronous rxjs angular-reactive-forms angular-validation