【问题标题】:Angular 7: Custom Async ValidatorAngular 7:自定义异步验证器
【发布时间】:2019-03-21 11:11:15
【问题描述】:

我正在尝试为我的注册表单创建一个自定义异步验证器,用于检查电子邮件是否已存在。如果电子邮件不存在则后端返回 404,如果存在则返回 200(无法更改此旧代码)。

我找到了一些教程,但没有找到使用最新 rxjs 库的教程。我创建了这个验证类:

export class UniqueEmailValidator {
    static createValidator(httpClient: HttpClient, degree: number, wlId: number) {
        return (control: AbstractControl) => {
            return httpClient.get(`${url}?degree=${degree}&email=${control.value}&wl_id=${wlId}`)
                .pipe(
                    map(
                        (response: Response) => {
                            return response.status === 404 ? null : { emailNotUnique: true };
                        }
                    )
                );
        };
    }
}

并在我的 ts 文件中创建我正在使用的表单

this.registerForm = this.fb.group({
            email: ['', [Validators.required, Validators.email], UniqueEmailValidator.createValidator(
                this.httpClient, this.wlService.wl.degree, this.wlService.wl.id)],

xhr 调用已完成并正确返回,但电子邮件的表单控件仍处于待处理状态。关于我做错了什么有什么想法吗?

【问题讨论】:

    标签: angular validation asynchronous rxjs angular7


    【解决方案1】:

    经过一段时间和更多研究后想通了。

    验证类:

    @Injectable()
    export class UniqueEmailValidator {
        constructor(private http: HttpClient) {}
    
        searchEmail(email: string, degree: number, wlId: number) {
            return timer(1000)
                .pipe(
                    switchMap(() => {
                        // Check if email is unique
                        return this.http.get<any>(`${url}?degree=${degree}&email=${email}&wl_id=${wlId}`);
                    })
                );
        }
    
        createValidator(degree: number, wlId: number): AsyncValidatorFn {
            return (control: AbstractControl): Observable<{ [key: string]: any } | null> => {
                return this.searchEmail(control.value, degree, wlId)
                    .pipe(
                        map(
                            (response: Response) => {
                                return null;
                            },
                        ),
                        catchError(
                            (err: any) => {
                                return err.status === 404 ? of(null) : of({ emailNotUnique: true });
                            },
                        ),
                    );
            };
        }
    }
    

    不确定是否可以更改计时器,但我在一篇文章中找到了它,它工作正常。希望对此进行一些确认。

    基本上我正在做一个 catchError,因为来自后端的响应返回 404 并从 catchError 再次返回一个 observable。

    然后在我正在做的表单创建中:

            this.registerForm = this.fb.group({
                email: ['', [Validators.required, Validators.email], this.uniqueEmailValidator.createValidator(
                this.wlService.wl.degree, this.wlService.wl.id
            )],
    

    并且我在模块中添加了 UniqueEmailValidator 作为提供者并注入到这个组件构造函数中。

    【讨论】:

    • 我有一个错误。 “this”在“UniqueEmailValidator”类中未定义。
    猜你喜欢
    • 1970-01-01
    • 2020-03-06
    • 2023-03-12
    • 1970-01-01
    • 2017-11-30
    • 2019-11-09
    • 2021-04-25
    • 2019-08-01
    • 1970-01-01
    相关资源
    最近更新 更多