【问题标题】:Angular reactive forms - get formControl for custom validatorAngular 反应式表单 - 为自定义验证器获取 formControl
【发布时间】:2018-09-12 11:34:04
【问题描述】:

我已经将一个通用的自定义验证器实现为如下所示的函数:

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,否则返回 errorobj。


现在我想在控件上分配这个自定义验证器,但我不知道如何传递当前的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})]]
        })
    });
}

但这不起作用。如何将当前的表单控件作为参数传递?

【问题讨论】:

    标签: angular typescript angular-reactive-forms


    【解决方案1】:

    我认为您没有以正确的方式编写验证器。

    试试这个。

    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')]]
    

    【讨论】:

    • 你是个野兽,谢谢!^^ 但是你应该修改你的解决方案:export function validate(condition: boolean, error: string): ValidatorFn { return (control: FormControl) => { return control.value && condition ? {[error]: true} : null; }; }
    • @Fantasia 好吧,那是我的第一个代码片段,但您使用的是一个接收控制值的函数。如果您使用布尔值作为参数,您将无法检查控制值...
    • 嗯是的..你是对的,它必须是一个函数。我的工作解决方案是这样的:export function validate(callback: Function, error: string): ValidatorFn { return (control: FormControl) => { return (!control.value || callback(control.value)) ? null : { [error]: true }; }; }
    • @Fantasia 是的,你把它拆了,我已经编辑了我的答案以缩短它control.value && callback(control.value) ?
    猜你喜欢
    • 2020-01-13
    • 2021-11-01
    • 2019-03-08
    • 2019-07-09
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2017-08-28
    相关资源
    最近更新 更多