2017-04-21 59 views
2

我有一个实现ControlValueAccessor的自定义窗体组件。该组件具有触摸的内部属性。Angular 2自定义窗体组件:提供标记方法

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; 
} 

这可能由该组件的用户时markAsTouched在formControl执行被调用的方法:customInputControl.markAsTouched()

我无法找到一个angular-这样做的方法。

@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调用。

回答

1

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

+0

不引发异常,但它没有收到注入的控件 – Zucca