2017-04-21 16 views
2

私はControlValueAccessorを実装するカスタムフォームコンポーネントを持っています。このコンポーネントには、内部プロパティが設定されています。私はangular-を見つけることができませんcustomInputControl.markAsTouched()角2カスタムフォームコンポーネント:markTouchedメソッドを提供

export class BmInputComponent implements ControlValueAccessor, Validator { 

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

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

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

は私がmarkAsTouchedがformControlに実行されたときに、コンポーネントのユーザーによって呼び出される可能性

markTouched() { 
    this.touched = true; 
} 

のようなメソッドを実装する必要がありますこれを行う方法。

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

} 

しかし、コンポーネントがformControlで呼び出されたとき、私はCannot instantiate cyclic dependency! NgControlを取得しています。

答えて

1

@Self()の代わりに@SkipSelf()を試しましたか?

+0

例外はスローされませんが、注入されたコントロールは受け取りません – Zucca

関連する問題