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 Car {
ngOnInit() {
// ERROR: 遅すぎる、コンポーネントインスタンスはすでに作成されています
const engine = inject(Engine);
engine.start();
}
}
エラーのデバッグ
エラーのスタックトレースをたどり、許可されていない inject() への呼び出しが行われている場所を特定します。
エラーを修正するには、inject の呼び出しを許可されている場所(通常はクラスコンストラクターまたはフィールドイニシャライザー)に移します。
NOTE: テストコンテキストで実行している場合は、TestBed.runInInjectionContext を使用すると、inject() が成功します。
TestBed.runInInjectionContext(() => {
// ...
});