fix(ivy): set proper implementation for module injector (#28667)
Prior to this change we used current injector implementation for module injector, which was causing problems and produces circular dependencies in case the same token is referenced (with @SkipSelf flag) in the `deps` array. The origin of the problem was that once `directiveInject` implementation becomes active, it was used for module injector as well, thus searching deps in Component/Directive DI scope. This fix sets `injectInjectorOnly` implementation for module injector to resolve the problem. PR Close #28667
This commit is contained in:

committed by
Miško Hevery

parent
5cafd44654
commit
553f80ff46
@ -392,10 +392,18 @@ export function getOrCreateInjectable<T>(
|
||||
|
||||
if ((flags & (InjectFlags.Self | InjectFlags.Host)) === 0) {
|
||||
const moduleInjector = lView[INJECTOR];
|
||||
if (moduleInjector) {
|
||||
return moduleInjector.get(token, notFoundValue, flags & InjectFlags.Optional);
|
||||
} else {
|
||||
return injectRootLimpMode(token, notFoundValue, flags & InjectFlags.Optional);
|
||||
// switch to `injectInjectorOnly` implementation for module injector, since module injector
|
||||
// should not have access to Component/Directive DI scope (that may happen through
|
||||
// `directiveInject` implementation)
|
||||
const previousInjectImplementation = setInjectImplementation(undefined);
|
||||
try {
|
||||
if (moduleInjector) {
|
||||
return moduleInjector.get(token, notFoundValue, flags & InjectFlags.Optional);
|
||||
} else {
|
||||
return injectRootLimpMode(token, notFoundValue, flags & InjectFlags.Optional);
|
||||
}
|
||||
} finally {
|
||||
setInjectImplementation(previousInjectImplementation);
|
||||
}
|
||||
}
|
||||
if (flags & InjectFlags.Optional) {
|
||||
|
Reference in New Issue
Block a user