Skip to content

Commit 30b0442

Browse files
JoostKIgorMinar
authored andcommittedApr 5, 2019
fix(core): call ngOnDestroy for tree-shakeable providers (#28943)
Prior to this change, any provider that was independently resolved using its InjectableDef would not be considered when destroying the module it was requested from. This commit provides a fix for this issue by storing the resolved provider in the module's list of provider definitions. Fixes #28927 PR Close #28943
1 parent f8cdda6 commit 30b0442

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed
 

‎packages/core/src/view/ng_module.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ export function resolveNgModuleDep(
109109
} else if (
110110
(injectableDef = getInjectableDef(depDef.token)) && targetsModule(data, injectableDef)) {
111111
const index = data._providers.length;
112-
data._def.providersByKey[depDef.tokenKey] = {
112+
data._def.providers[index] = data._def.providersByKey[depDef.tokenKey] = {
113113
flags: NodeFlags.TypeFactoryProvider | NodeFlags.LazyProvider,
114114
value: injectableDef.factory,
115115
deps: [], index,

‎packages/core/test/view/ng_module_spec.ts

+22
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,28 @@ describe('NgModuleRef_ injector', () => {
200200
expect(Service.destroyed).toBe(1);
201201
});
202202

203+
it('calls ngOnDestroy on scoped providers', () => {
204+
class Module {}
205+
206+
class Service {
207+
static destroyed = 0;
208+
209+
ngOnDestroy(): void { Service.destroyed++; }
210+
211+
static ngInjectableDef: InjectableDef<Service> = defineInjectable({
212+
factory: () => new Service(),
213+
providedIn: 'root',
214+
});
215+
}
216+
217+
const ref = createNgModuleRef(Module, Injector.NULL, [], makeFactoryProviders([], [Module]));
218+
219+
expect(ref.injector.get(Service)).toBeDefined();
220+
expect(Service.destroyed).toBe(0);
221+
ref.destroy();
222+
expect(Service.destroyed).toBe(1);
223+
});
224+
203225
it('only calls ngOnDestroy once per instance', () => {
204226
class Module {}
205227

0 commit comments

Comments
 (0)
Please sign in to comment.