使用注入的提供程序进行角度异步表单验证

时间:2017-12-08 18:43:08

标签: angular typescript angular-reactive-forms

我有一个自定义异步验证器,它需要调用服务来验证名称是否唯一。

由于验证器是纯函数,因此似乎不是注入HTTP等提供程序来进行这些调用的好方法。

我目前拥有的代码是返回一个传递服务的函数,但这感觉有点笨拙......

export function nameValidator(platformService: PlatformService): ValidatorFn {
    return (control: FormControl): { [key: string]: any } => {
        return userService.getUnique(control.value)
    };
}

我的问题是有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

验证器在用作模板中的指令时可以是可注射的directive classes

FormControlFormBuilder

中直接指定它们时,它们应该是函数

为了使用DI,他们应该是useFactoryuseClass个提供者并注入一个组件:

@Injectable()
class NameValidator implements AsyncValidator {
  constructor(private userService: UserService) {}

  validate = (control: FormControl) => this.userService.getUnique(control.value);
}

...

new FormControl('', nameValidator.validate);

请注意,validate方法作为回调传递,应该是箭头或绑定到bind的类实例。