我有一个自定义异步验证器,它需要调用服务来验证名称是否唯一。
由于验证器是纯函数,因此似乎不是注入HTTP等提供程序来进行这些调用的好方法。
我目前拥有的代码是返回一个传递服务的函数,但这感觉有点笨拙......
export function nameValidator(platformService: PlatformService): ValidatorFn {
return (control: FormControl): { [key: string]: any } => {
return userService.getUnique(control.value)
};
}
我的问题是有更好的方法吗?
答案 0 :(得分:2)
验证器在用作模板中的指令时可以是可注射的directive classes。
在FormControl
或FormBuilder
为了使用DI,他们应该是useFactory
或useClass
个提供者并注入一个组件:
@Injectable()
class NameValidator implements AsyncValidator {
constructor(private userService: UserService) {}
validate = (control: FormControl) => this.userService.getUnique(control.value);
}
...
new FormControl('', nameValidator.validate);
请注意,validate
方法作为回调传递,应该是箭头或绑定到bind
的类实例。