Encyclopédie des erreurs

inject() doit être appelé depuis un contexte d'injection

Vous voyez cette erreur lorsque vous essayez d'utiliser la fonction inject en dehors du contexte d'injection autorisé. Le contexte d'injection est disponible pendant la création et l'initialisation de la classe. Il est aussi disponible pour les fonctions utilisées avec runInInjectionContext.

En pratique, les appels à inject() sont autorisés dans un constructeur, un paramètre de constructeur et un initialiseur de champ :

@Service()
export class Car {
  radio: Radio | undefined;

  // OK: field initializer
  spareTyre = inject(Tyre);

  constructor() {
    // OK: constructor body
    this.radio = inject(Radio);
  }
}

Il est également permis d'appeler inject depuis la fabrique d'un provider :

providers: [
  {
    provide: Car,
    useFactory: () => {
      // OK: a class factory
      const engine = inject(Engine);
      return new Car(engine);
    },
  },
];

Les appels à la fonction inject en dehors de la création de la classe ou de runInInjectionContext provoquent une erreur. En particulier, les appels à inject() sont interdits après la création d'une instance de classe, dans les méthodes (y compris les lifecycle hooks) :

@Component({ ... })
export class Car {
  ngOnInit() {
    // ERROR: too late, the component instance was already created
    const engine = inject(Engine);
    engine.start();
  }
}

Déboguer l'erreur

Remontez la stack trace de l'erreur pour identifier l'endroit où se trouve l'appel interdit à inject().

Pour corriger l'erreur, déplacez l'appel à inject vers un endroit autorisé (généralement un constructeur de classe ou un initialiseur de champ).

Note : Si vous exécutez du code dans un contexte de test, TestBed.runInInjectionContext permet à inject() de réussir.

TestBed.runInInjectionContext(() => {
  // ...
});