Angular a introduit la inject()fonction dans les versions récentes, ce qui nous permet d'obtenir une référence à un fournisseur de manière fonctionnelle plutôt que d'utiliser la Injector.get()méthode. Cependant, si vous l'avez utilisé ou une bibliothèque qui l'utilise sous le capot, vous avez peut-être rencontré l'erreur suivante :
inject() must be called from an injection context
such as a constructor, a factory function, a field initializer,
or a function used with `runInInjectionContext`.
Angular a deux variables globales qui peuvent contenir an injectorà un certain moment : une pour an Injectoret une pour NodeInjector. Voici les extraits de code pour les deux :
let _currentInjector = undefined;
export function getCurrentInjector() {
return _currentInjector;
}
export function setCurrentInjector(injector: Injector|undefined|null {
const former = _currentInjector;
_currentInjector = injector;
return former;
}
let _injectImplementation
export function getInjectImplementation() {
return _injectImplementation;
}
export function assertInInjectionContext(debugFn: Function): void {
if (!getInjectImplementation() && !getCurrentInjector()) {
throw new RuntimeError(
RuntimeErrorCode.MISSING_INJECTION_CONTEXT,
ngDevMode &&
(debugFn.name +
'() can only be used within an injection context such as a constructor, a factory function, a field initializer, or a function used with `runInInjectionContext`'));
}
}
import {
ElementRef,
assertInInjectionContext,
inject,
} from '@angular/core';
export function injectNativeElement<T extends Element>(): T {
assertInInjectionContext(injectNativeElement);
return inject(ElementRef).nativeElement;
}
factoryfonction spécifiée pour un InjectionToken:export const FOO = new InjectionToken('FOO', {
factory() {
const value = inject(SOME_PROVIDER);
return ...
},
});
@Component({
providers: [
{
provide: FOO,
useFactory() {
const value = inject(SOME_PROVIDER);
return ...
},
},
]
})
export class FooComponent {}
@Component({})
export class FooComponent {
foo = inject(FOO);
constructor(private ngZone: NgZone = inject(NgZone)) {
const bar = inject(BAR);
}
}
runInInjectionContextfonction :import { runInInjectionContext } from '@angular/core';
export class FooComponent {
ngOnInit() {
runInInjectionContext(this.injector, () => {
console.log(
'I can access the NodeInjector using inject()',
inject(ElementRef)
);
})
}
Suivez-moi sur Medium ou Twitter pour en savoir plus sur Angular et JS !
Embarquez pour un voyage passionnant d'innovation et de succès en exploitant le potentiel inexploité de ces surprenantes plateformes sans code. Permettez-moi de partager avec vous l'histoire de Sapna, une remarquable femme entrepreneure.
Cette semaine, j'ai reçu un e-mail d'un membre de la liste de diffusion quotidienne. Ils voulaient savoir : Quelles ressources consultez-vous quotidiennement, hebdomadairement et mensuellement ? Grande question ! Je suis heureux d'essayer de partager quelques idées sur mon flux de travail et les principales ressources que j'utilise.
Si nous voulons continuer à prospérer sur cette planète, nous allons devoir avoir des conversations dangereuses. Celles qui remettent en question ce que nous avons fait, ce que nous faisons et ce que nous sommes actuellement sur le point de continuer à faire (ou prévoyons de faire).
Combien de fois avez-vous jeté une bouteille en plastique, un bocal en verre, une canette en aluminium ou un paquet d'énergie verte sans réfléchir à deux fois ? Combien de fois avez-vous souhaité pouvoir obtenir quelque chose en échange de leur recyclage ? Si vous êtes comme la plupart des gens, la réponse est probablement plusieurs fois. Le recyclage est souvent perçu comme un tracas, une corvée ou un devoir qui n'apporte aucun bénéfice immédiat ou tangible.
Ça me frappe tout à coup, comme c'est si souvent le cas C'est à nouveau le milieu du chemin <Non, pas celui du Pacifique, toi marron, celui du carnaval> Chaque gros titre fort… ..