3

我有一个实现 ControlValueAccessor 的自定义表单组件。这个组件有一个内部属性被触及。

export class BmInputComponent implements ControlValueAccessor, Validator {

    private onTouchedCallback: () => {};
    private touched: boolean = false;

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

    onBlur() {
        this.touched = true;
        this.onTouchedCallback();
    }
}

我需要实现一个类似的方法

markTouched() {
    this.touched = true;
}

当在 formControl 中执行 markAsTouched 时,组件的用户可以调用它:customInputControl.markAsTouched()

我找不到这样做的角度方式。

@Edit:试图注入 NgControl:

@Component({
    selector: 'bm-input',
    templateUrl: './bm-input.component.html',
    encapsulation: ViewEncapsulation.None,
    providers: [
         {
            provide: NG_VALUE_ACCESSOR,
            useExisting: forwardRef(() => BmInputComponent),
            multi: true
        }
    ]
})
export class BmInputComponent implements ControlValueAccessor, Validator {

    private onTouchedCallback: () => {};
    private touched: boolean = false;

    constructor(@Self() @Optional() public _formControl: NgControl) {
        this._viewDate = new Date();
        if (this._formControl) {
            this._formControl.valueAccessor = this;
            this._formControl.statusChanges.subscribe(this.markTouched);
        }
    }
    registerOnTouched(fn: any) {
        this.onTouchedCallback = fn;
    }

    onBlur() {
        this.touched = true;
        this.onTouchedCallback();
    }

    markTouched() {
        if(this._formControl.touched)
            this.touched = true;
    }

}

Cannot instantiate cyclic dependency! NgControl但是当使用 formControl 调用组件时,我得到了。

4

3 回答 3

1

您是否尝试过@SkipSelf() 而不是@Self()?

于 2017-04-24T11:19:52.403 回答
0

你可以试试这个:

constructor(private injector: Injector) {
}


ngDoCheck() {

    let ngControl = this.injector.get(NgControl);
    if (! ngControl.control) {
        return;
    }

    this.touched = ngControl.control.touched;

}


于 2019-03-16T23:22:51.063 回答
0

循环依赖是由NG_VALUE_ACCESSOR你的@Component(...)提供者和构造函数中的注入引起NgControl的。这些是相互排斥的。

在此处查看 NG 材料文档中的示例:https ://material.angular.io/guide/creating-a-custom-form-field-control#ngcontrol

于 2021-12-21T08:21:16.690 回答