inject 関数を許可されていない注入コンテキスト の外で使用しようとすると、このエラーが表示されます。注入コンテキストは、クラスの作成と初期化時に使用できます。
また、runInInjectionContext で使用される関数でも使用できます。
実際には、inject() の呼び出しは、コンストラクター、コンストラクターパラメーター、フィールドイニシャライザーで許可されます。
@Injectable({providedIn: 'root'})export class Car { radio: Radio|undefined; // OK: フィールドイニシャライザー spareTyre = inject(Tyre); constructor() { // OK: コンストラクターボディ this.radio = inject(Radio); }}
また、プロバイダーのファクトリーから inject を呼び出すことも合法です。
providers: [ {provide: Car, useFactory: () => { // OK: クラスファクトリー const engine = inject(Engine); return new Car(engine); }}]
クラスの作成または runInInjectionContext の外での inject 関数への呼び出しは、エラーになります。特に、inject() への呼び出しは、クラスインスタンスが作成された後、メソッド(ライフサイクルフックを含む)では許可されません。
@Component({ ... })export class CarComponent { ngOnInit() { // ERROR: 遅すぎる、コンポーネントインスタンスはすでに作成されています const engine = inject(Engine); engine.start(); }}
エラーのデバッグ
エラーのスタックトレースをたどり、許可されていない inject() への呼び出しが行われている場所を特定します。
エラーを修正するには、inject の呼び出しを許可されている場所(通常はクラスコンストラクターまたはフィールドイニシャライザー)に移します。
NOTE: テストコンテキストで実行している場合は、TestBed.runInInjectionContext を使用すると、inject() が成功します。
TestBed.runInInjectionContext(() => { // ...});