【问题标题】:Why Angular 4 FormGroup custom validator not working?为什么 Angular 4 FormGroup 自定义验证器不起作用?
【发布时间】:2019-02-12 11:39:06
【问题描述】:

尝试在表单组上添加自定义验证器 formValidator()。根据某些情况,我正在设置错误{invalidData: true}。但是当条件为假时,将错误设置为空。 control2 本身具有必需的验证器。如果我将错误设置为 null,它也会清除所需的验证器。

参考以下代码,

createReactiveForm(data: any) {
    const formGroup = new FormGroup({
        'control1': new FormControl(data.value1),
        'control2': new FormControl(data.value2, [Validators.required])
    }, this.formValidator());
}

formValidator(): ValidatorFn {
    return (group: FormGroup): ValidationErrors => {
        const control1 = group.controls['control1'];
        const control2 = group.controls['control2'];
        if (control1.value === 'ABC' && control2.value !== 'ABC') {
            control2.setErrors({ invalidData: true });
        } else {
            control2.setErrors(null);
        }
        return;
    };
}

解决办法是什么?还是我在自定义验证器中做错了什么?请帮忙。

【问题讨论】:

    标签: angular typescript angular-reactive-forms angular-validation


    【解决方案1】:

    验证函数不应该在控件上设置错误。他们应该返回验证错误对象。

    formValidator(): ValidatorFn {
        return (group: FormGroup): ValidationErrors => {
            // use the abstraction provided by the framework
            const control1 = group.get('control1');
            const control2 = group.get('control2');
            // return the correct value depending on your condition
            return control1.value === 'ABC' && control2.value !== 'ABC' ? 
              { invalidData: true } : null;
        };
    }
    

    【讨论】:

    • 但我想在 control2 上设置错误。解决办法是什么?如果我返回错误对象,那么如何使用该对象在 control2 上设置错误?
    • 我已经回答了a similar question 不久前。但最干净的解决方案确实是将验证器保持在组级别,并使用条件 *ngIf="form.hasError(...)" 而不是 *ngIf="form.get(...).hasError(...)"
    • 不,只有一个,即在组级别,您在组而不是控件上设置条件。就像我刚才说的......
    猜你喜欢
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 2017-11-30
    • 2021-06-24
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 2018-01-19
    相关资源
    最近更新 更多