【问题标题】:Angular async validator error is not showing角度异步验证器错误未显示
【发布时间】:2021-07-31 16:56:17
【问题描述】:

我在尝试实现异步验证器时遇到问题。这是我的尝试:

export class EmailValidator {
    static createValidator(): AsyncValidatorFn {
        return (control: AbstractControl): Observable<ValidationErrors | null> => {
            return of({}).pipe(
                delay(1000),
                tap(() => {
                    const isMatch = /[A-Za-z0-9]{6,}@gmail.com/.test(control.value);
                    return isMatch ? null : { invalidEmail: true }
                })
            )
        };
    }
}

这是表单的基本创建:

this.loginForm = this.fb.group({
      email: [
        '',
        [
          Validators.required,
        ],
        EmailValidator.createValidator()
      ],
      password: [
        '',
        [
          Validators.required,
          Validators.minLength(8)
        ]
      ]
    });

这是我的html:

<div class="container">
    <ul>
        <li class="active"><a routerLink="/login">Login</a></li>
        <li><a routerLink="/auth/register">Register</a></li>
    </ul>
    <form [formGroup]="loginForm" (ngSubmit)="onSubmit()">
        <input formControlName="email" type="email" placeholder="email">
        <div *ngIf="(loginForm.get('email')?.touched || loginForm.get('email')?.dirty) && loginForm.get('email')?.errors?.required">
            Email is required!
        </div>
        <div *ngIf="loginForm.get('email')?.errors?.invalidEmail">
            Email is invalid!
        </div>
        <input formControlName="password" type="password" placeholder="password">
        <input type="submit" value="Login">
    </form>
</div>

当我尝试在验证器内部调试时,如果匹配则返回 null,如果不匹配则返回错误对象。由于某种原因,错误 div 未呈现。

【问题讨论】:

  • 您已将emailAsyncValidatorDirective 添加到您的模板中,但缺少实现代码。您能否在最初的问题中也提供这一点。
  • 我第一次尝试用指令来做,但也失败了:D,现在我将其删除,谢谢指出。

标签: angular validation


【解决方案1】:

您应该使用map 而不是tap 作为rxjs 运算符。

import { ..., map } from 'rxjs/operators';

export class EmailValidator {
  static createValidator(): AsyncValidatorFn {
    return (control: AbstractControl): Observable<ValidationErrors | null> => {
      return of({}).pipe(
        delay(1000),
        map(() => {
          const isMatch = /[A-Za-z0-9]{6,}@gmail.com/.test(control.value);
          return isMatch ? null : { invalidEmail: true };
        })
      );
    };
  }
}

Sample solution on StackBlitz


您可以阅读What is the difference between tap and map in RxJS?

【讨论】:

  • 不客气。同时,我更新了关于 RxJS 中 maptap 之间区别的答案。您可以花时间阅读它。很高兴看到我的回答对您有所帮助。谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
相关资源
最近更新 更多