【问题标题】:Trigger custom form control validation on @Input change在@Input 更改时触发自定义表单控件验证
【发布时间】:2018-01-09 08:16:10
【问题描述】:

我有一个简单的自定义表单控件,只有一个输入:

const NGX_HELLO_VALUE_ACCESSOR = {
    provide: NG_VALUE_ACCESSOR,
    useExisting: forwardRef(() => HelloComponent),
    multi: true
};

const NGX_HELLO_VALIDATORS = {
    provide: NG_VALIDATORS,
    useExisting: forwardRef(() => HelloComponent),
    multi: true
};

@Component({
    selector: 'hello',
    template: `<p>Value in custom form control: {{value}}</p>`,
    providers: [NGX_HELLO_VALUE_ACCESSOR, NGX_HELLO_VALIDATORS]
})
export class HelloComponent implements OnChanges, ControlValueAccessor, Validator  {

    @Input() maxLength: number;

    value: string;
    onChangeCb: (_: any) => void = () => { };
    onTouchedCb: () => void = () => { };

    ngOnChanges(changes: SimpleChanges): void {
        //trigger validation
    }

    writeValue(value: any): void {
        this.value = value;
    }

    registerOnChange(fn: any): void {
        this.onChangeCb = fn;
    }

    registerOnTouched(fn: any): void {
        this.onTouchedCb = fn;
    }

    validate(control: FormControl): ValidationErrors {
        if(this.value && this.value.length > this.maxLength) {
            return {
                tooLong: this.maxLength
            };
        }
        return null;
    }
}

效果很好。每当值更改时,角度调用都会验证并验证控件。问题是当@Input maxLength 更改时如何运行验证?

我创建了stackblitz 示例来玩玩。

【问题讨论】:

    标签: angular typescript


    【解决方案1】:
     ngOnChanges(changes: SimpleChanges): void {
        //trigger validation
        this.onChangeCb(this.value);
      }
    

    做到这一点,似乎对值更改进行角度重新运行验证。

    Forked stackblitz

    【讨论】:

    • 谢谢,它确实重新验证了控件,不幸的是调用onChangeCb 在表单控件上设置了脏标志。有什么想法可以防止这种情况发生吗?
    • 否,因为您似乎无法通过 controlValueAccessor 访问 formControl。但也许你可以触发 onChangeCb 只有当一个值已经设置,(然后已经脏)
    猜你喜欢
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多