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(() => { // ...});