angular - 等待 asyncValidator 完成的反应式 Angular 表单
问题描述
我正在构建一个反应式表单,当我提交表单时,我检查表单是否有效,有时我会得到表单无效,但那个时候控制台打印表单是有效的并且表单状态也是有效的。如果我删除AsyncValidator我不会遇到任何问题..
这是我的代码片段:AsyncDirective:
import { Directive, Input } from '@angular/core';
import { AbstractControl, AsyncValidator, NG_ASYNC_VALIDATORS, ValidationErrors } from '@angular/forms';
import { Observable } from 'rxjs';
import { debounceTime, distinctUntilChanged, first } from 'rxjs/operators';
import { SupportersService } from 'src/app/pages/settings/view-supporters/supporters.service';
import { validateEmail } from '../functions/validator';
@Directive({
selector: '[emailExistCheck]',
providers: [{
provide: NG_ASYNC_VALIDATORS, useExisting: EmailExistCheckDirective, multi:
true
}]
})
export class EmailExistCheckDirective implements AsyncValidator {
@Input() emailExistCheck: { player_id: AbstractControl };
constructor(private supporterService: SupportersService) { }
validate(c: AbstractControl): Observable<ValidationErrors | null> {
return this.checkEmailExist(c.value)
.pipe(
debounceTime(500),
distinctUntilChanged(),
first()
)
}
checkEmailExist(email: string) {
let player_id = this.emailExistCheck.player_id ? this.emailExistCheck.player_id : 'new_player';
let isValid = validateEmail(email);
return new Observable(observer => {
if (isValid) {
this.supporterService.checkExistEmail(email, player_id)
.subscribe((result: any) => {
if (result && result.is_exist) {
observer.next({ invalid: true, message: 'Email already exist' });
} else {
observer.next(null)
}
})
} else {
observer.next(null)
}
})
}
}
提交表格:
console.log(this.playerAddForm.valid) // when it show true but it goto else block
if(this.playerAddForm.valid){
}else{
//my code go here, but no invalid control I found here
const controls = this.playerAddForm.controls;
for (const name in controls) {
if (controls[name].invalid) {
invalid_control_name += ', ' + name;
}
}
}
解决方案
推荐阅读
- vb.net - 为什么 math.round 不四舍五入到 2 位?
- spring - 使用 Hibernate/Spring 数据批量插入 Postgres DB:60K 行需要 2 分钟,这是不可接受的
- flutter - 在 Flutter、Dart 中找到准确的单词
- terraform - 如何将实例列表中的“IP”和“名称”与 Terraform local-exec 结合起来
- javascript - 如何在没有递归函数的情况下在javascript中获取可能的数组项序列?
- python - 想要为每个盆栽簇着色不同的颜色
- python - 以动态方式安装特定版本的python依赖项
- python-3.x - 字符串匹配 KMP
- amazon-web-services - 达到内存限制时,API Gateway 中的缓存行为如何?
- html - 为什么在使用媒体查询时隐藏部分 HTML 不起作用