エラー百科辞典

inject() must be called from an injection context

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