我已经将一个通用的自定义验证器实现为如下所示的函数:
export function validate(control: AbstractControl, validation: boolean,
errObj: { [key: string]: boolean }): null | { [key: string]: boolean } {
const toCheck: string = control.value;
if (!toCheck || validation) {
return null;
} else {
return errObj;
}
}非常简单和直接:它从表单控件中获取值,如果定义了值,或者传递给参数的条件,它返回null,否则就是一个错误。
现在我想在控件上分配这个自定义验证器,但是我不知道如何传递当前的Abstractcontrol。我试过这样的方法:
private formBuilder: FormBuilder = new FormBuilder();
public setForm(form: SomeType): FormGroup {
return this.formBuilder.group({
days: [form.days],
...
useDefaultRule: [form.useDefaultRule],
urls: this.formBuilder.group({
webUrl: [form.urls.webUrl, [validate(new FormControl(),
hasWebURLPattern(new FormControl().value),
{webUrl: true})]]
})
});
}但这行不通。如何将当前窗体控件作为参数传递?
发布于 2018-09-12 11:48:51
我认为你没有用正确的方式编写验证器。
试试这个吧。
export function validate(callback: Function, error: string): ValidatorFn {
return (control: FormControl) => {
return control.value && callback(control.value) ? { [error]: true } : null;
};
}你可以用
webUrl: ['', [validate(hasWebURLPattern, 'webUrl')]]它通过赋予一个函数来工作,该函数将与表单控件的值一起直接调用到验证器中。您还直接提供了错误字符串,从而有效地降低了代码复杂度。
此外,不要忘记您将丢失this上下文:如果回调中包含this引用,则将其添加到调用中:
webUrl: ['', [validate(hasWebURLPattern.bind(this), 'webUrl')]]https://stackoverflow.com/questions/52294169
复制相似问题