2017-03-24 21 views
15

私はAngular/TypeScriptアプリケーションには多少役に立たないエラーがあります。誰かがエラーメッセージを改善するまで、これについて何ができますか?これが起こる最も可能性の高い状況は何ですか?エラー:「定義されていないプロバイダが見つかりました!通常、これは循環依存関係があることを意味します」

Uncaught Error: Encountered undefined provider! Usually this means you have a circular dependencies (might be caused by using 'barrel' index.ts files. 
    at Object.syntaxError 
    at eval  at Array.forEach (native) [<root>] 
    at CompileMetadataResolver._getProvidersMetadata 
    at CompileMetadataResolver.getNgModuleMetadata 
    at CompileMetadataResolver.getNgModuleSummary 
    at eval 
... 

答えて

10

一つの可能​​性は、同じファイル内のサービスおよびモジュールを宣言しようとしていると、サービスの前にモジュールを宣言されています

import {Injectable, NgModule} from '@angular/core'; 

@NgModule({providers: [FooService]}) // WRONG: used before declared 
export class FooModule { 
} 

@Injectable() 
export class FooService { 
} 

は、あなたが最初のサービスを宣言することでこの問題を解決することができ、または次のことができます次のようにforwardRefを使用してください:

import {forwardRef, Injectable, NgModule} from '@angular/core'; 

@NgModule({providers: [forwardRef(() => FooService)]}) 
export class FooModule { 
} 

@Injectable() 
export class FooService { 
} 
+0

完璧に動作します!このようなforwardRefを作成するシナリオは悪い考えですか? – cjsimon

+1

私はforwardRefが危険であるとは思っていません。あなたのシンボルが使用される前に宣言されていれば不必要です。場合によっては、ファイルを別々のファイルに入れるほうがいいかもしれませんが、小さな/簡単なモジュール宣言では必ずしも余分なファイルの価値があるとは限りません。 –

+0

私のコンポーネントは別々のファイルにあります。最初にプロバイダーモジュールを宣言するだけで十分でしょうか、それとも他のモジュールの前にページで初期化する必要がありますか? – cjsimon

関連する問題