我有一个指令来验证输入值是否包含在值列表中。此值列表是动态的,因此它是指令的参数:
@Directive({
selector: '[lookup]',
providers: [{provide: NG_VALIDATORS, useExisting: LookupDirective, multi: true}]
})
export class LookupDirective implements Validator {
@Input() lookupCollection: Array<any>;
validate(control: AbstractControl): { [key: string]: any } {
return lookupValidator(this.lookupCollection)(control);
}
}
在html中,指令的使用方式如下:
lookup [lookupCollection]="myService.valuesAsObservable | async"
问题是,验证器仅在输入更改时调用,而不是在observable提交新值时调用。
另外,我不是在指令中注入服务,因为根据组件的不同,使用的服务也不一样。
由于
答案 0 :(得分:0)
创建一个使用任意参数而不是AbstractControl的acync验证器。这样您就可以完全控制何时调用它。看看这个示例应用: https://github.com/Farata/angular2typescript/tree/master/Angular4/form-samples/src/app/async-validator
特别是,看看我如何在服务中使用checkWorkAuthorizationV2()方法。在那个例子中,我订阅了valueChanges,但我可以随时调用这个方法。返回该方法后,我使用表单上的setErrors()方法来显示错误(如果有的话)。