2016-10-01 11 views
1

は、私はこのようなNgControlを注入カスタム角度2バリディレクティブ、作成しようとしています原因:は、循環依存

@Directive({ 
    selector: '[ngModel][customValidator]', 
    providers: [{provide: NG_VALIDATORS, useExisting: CustomValidatorDirective, multi: true}] 
}) 
export class CustomValidatorDirective implements Validator { 
    private validateFunction: ValidatorFn; 

    constructor(private control: NgControl) { }; 

} 

をしかし、私は次のエラーを取得:

Cannot instantiate cyclic dependency! NgControl

どのように私はそれをworkarroundことができる知っているので、私は初期化後にngControlにアクセスできますか?

+0

どのバージョンをお使いですか? – micronyks

+0

バージョンは2.0.0 –

+0

です。ここからプロバイダセクションを削除して@NgModel({})に追加できますか? – micronyks

答えて

-1

プロバイダー、パイプ、ディレクティブ宣言が@Componeから除去されるNT又は@DirectiRC6又はRC7デコレータをまし。だから、あなただけディレクティブ

から

providers: [{provide: NG_VALIDATORS, useExisting: CustomValidatorDirective, multi: true}] 

を削除して、あなたが巡回避けるために、インジェクターを経由してNgControlを注入することができます@NgModule({})デコレータ

@NgModule({ 
... 
providers: [{provide: NG_VALIDATORS, useExisting: CustomValidatorDirective, multi: true}] 

}) 
+1

ディレクティブのAFAIK 'providers'プロパティは引き続き動作します。削除されていませんhttps://github.com/angular/angular/blob/master/modules/%40angular/core/src/metadata/directives.ts#L337 https://angular.io/docs/ts/latest/ cookbook/ngmodule-faq.html#!#q-component-or-module – yurzui

+0

@yurzuiシェアをありがとう。それでは、このようなプロバイダの設定をここで提供するのではないという問題があります。他のインスタンスや何かを作成するプロバイダを提供しているかもしれません。 – micronyks

+1

私はプロバイダー登録をディレクティブではなくNgModuleに置くと、ValidatorがCustomValidatorDirectiveにアクセスできるモジュール間で共有されるようになります。明らかに、NG_VALIDATORSは、他のディレクティブがそれを使用しているときには汚染されます。 –

0

にそれを追加する必要があります依存。

constructor(private _injector: Injector) { } 

ngOnInit() { 
    console.log(this._injector.get(NgControl)) 
}