mirror of
https://github.com/affaan-m/everything-claude-code.git
synced 2026-05-14 00:23:04 +08:00
1.9 KiB
1.9 KiB
Injection Context
The inject() function can only be used when code is executing within an injection context.
Where is an Injection Context Available?
An injection context is automatically available in:
- Field initializers of classes instantiated by DI (
@Injectable,@Component,@Directive,@Pipe). - Constructors of classes instantiated by DI.
- Factory functions specified in
useFactoryorInjectionTokenconfigurations. - Functional APIs executed by Angular (e.g., functional route guards, resolvers, interceptors).
@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);
}
}
runInInjectionContext
If 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);
});
}
}
assertInInjectionContext
Use 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;
}