skills/dev-skills/angular-developer/references/injection-context.md
The inject() function can only be used when code is executing within an injection context.
An injection context is automatically available in:
@Injectable, @Component, @Directive, @Pipe).useFactory or InjectionToken configurations.@Component({...})
export class Example {
// ✅ Valid: Field initializer
private router = inject(Router);
constructor() {
// ✅ Valid: Constructor
const http = inject(HttpClient);
}
onClick() {
// ❌ Invalid: Not an injection context
// const auth = inject(AuthService);
}
}
runInInjectionContextIf you need to run a function within an injection context (often needed for dynamic component creation or testing), use runInInjectionContext. This requires access to an existing injector (like EnvironmentInjector or Injector).
import {Injectable, inject, EnvironmentInjector, runInInjectionContext} from '@angular/core';
@Injectable({providedIn: 'root'})
export class MyService {
private injector = inject(EnvironmentInjector);
doSomethingDynamic() {
runInInjectionContext(this.injector, () => {
// ✅ Now valid to use inject() here
const router = inject(Router);
});
}
}
assertInInjectionContextUse assertInInjectionContext in utility functions to guarantee they are called from a valid context. It throws a clear error if not.
import {assertInInjectionContext, inject, ElementRef} from '@angular/core';
export function injectNativeElement<T extends Element>(): T {
assertInInjectionContext(injectNativeElement);
return inject(ElementRef).nativeElement;
}