Angular 6 - 预期验证器在异步验证器中返回 Promise 或 Observable

标签 angular angular6

在我的 Angular 6 应用程序中,我有异步验证器来检查输入的电子邮件是否已注册,但现在我收到“预期验证器返回 Promise 或 Observable”,我真的不知道为什么。

import { UserService } from '../user/service/user.service';
import { AbstractControl, ValidationErrors, AsyncValidator } from '@angular/forms';
import * as validationUtils from '../validation/validation-utils';
import { Injectable } from '@angular/core';
import { of, Observable } from 'rxjs';
import { map } from 'rxjs/operators';

@Injectable({
  providedIn: 'root'
})
export class EmailExistValidator implements AsyncValidator {
  constructor(private userService: UserService) {
  }

  validate(emailControl: AbstractControl): Promise<ValidationErrors | null> | Observable<ValidationErrors | null> {
    const email = emailControl.value;

    if (new RegExp(validationUtils.emailRegex).test(email)) {
      this.userService
      .checkIfEmailExist(email)
      .pipe(
        map(
        (data) => {
          return {emailExist: true};
        },
        (error) => {
          return null;
        }
      ));
    }
      return of(null);
  }
}

注册组件.ts

  createForm(): FormGroup {
    return this.formBuilder.group({
      email: ['',
      [Validators.required, Validators.email],
      [EmailExistValidator.bind(this)]],
      username: ['', [Validators.required,
        Validators.pattern(validationUtils.usernameRegex)]],
      password: ['', [Validators.required,
        Validators.pattern(validationUtils.passwordRegex)]],
      repeatPassword: ['', [Validators.required]]
  }, {
    validator: EqualPasswordValidator.validate
  });
  }

编辑2018年8月17日 正如 @Paulie 建议的那样,我将 formbuilder 中的验证器声明从 .bind 更改为指向 validate 函数,并对他的提议进行了一些调整,现在一切正常了!

最终代码:

注册组件.ts

  constructor(
    private formBuilder: FormBuilder,
    private userService: UserService,
    private emailExistsValidator: EmailExistsValidator,
    private usernameExistsValidator: UsernameExistsValidator) { }

  ngOnInit() {
    this.registerForm = this.createForm();
  }

  createForm(): FormGroup {
    return this.formBuilder.group({
      email: ['',
      [Validators.required, Validators.email],
      [this.emailExistsValidator.validate]],
      username: ['', [Validators.required,
        Validators.pattern(validationUtils.usernameRegex)],
        [this.usernameExistsValidator.validate]],
      password: ['', [Validators.required,
        Validators.pattern(validationUtils.passwordRegex)]],
      repeatPassword: ['', [Validators.required]]
  }, {
    validator: EqualPasswordValidator.validate
  });
  }

电子邮件存在-validator.ts

import { UserService } from '../user/service/user.service';
import { AbstractControl, ValidationErrors, AsyncValidator } from '@angular/forms';
import * as validationUtils from './validation-utils';
import { Injectable } from '@angular/core';
import { of, Observable } from 'rxjs';
import { map, catchError } from 'rxjs/operators';

@Injectable({
  providedIn: 'root'
})
export class EmailExistsValidator implements AsyncValidator {
    static userService: UserService;

  constructor(private userService: UserService) {
    EmailExistsValidator.userService = userService;
  }

  validate(emailControl: AbstractControl): Promise<{ [key: string]: any } | null>
  | Observable<{ [key: string]: any } | null>  {

    const email = emailControl.value;

    if (new RegExp(validationUtils.emailRegex).test(email)) {
        return EmailExistsValidator.userService
        .checkIfEmailExist(email)
        .pipe(
          map(data => ({emailExist: true})),
          catchError(error => of(null))
        );
      }

      return of(null);

}
}

最佳答案

当您添加多个验证器时,您需要将验证器添加到另一个第三个括号 '[]' 内。像下面这样:

this.yourForm= this.formBuilder.group({
    amount: [null, [Validators.required, Validators.min(1)]],
});

关于Angular 6 - 预期验证器在异步验证器中返回 Promise 或 Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51864074/

相关文章:

javascript - 从数组中删除项目时如何使用behaviorSubject

angular - ngx-select-dropdown 示例值未绑定(bind)

Angular 6 router.events.filter 'filter' 在类型 'Observable<Event>' 上不存在

Angular CDK 拖放 - 对齐网格

angular - _angular_core__WEBPACK_IMPORTED_MODULE_1__ ["ɵvid"] 不是一个函数

angular - 移动 Angular 4 App 以保护 SSL 证书错误

html - 根据开始和结束日期过滤 Angular 6 元素

javascript - 在 Angular2 中的 router.navigate 之后执行代码

javascript - 在构建时更改 Angular Material 主题变量

javascript - ng.probe(selector) 总是导致 NULL