mirror of
https://github.com/angular/angular
synced 2026-05-24 09:28:37 +00:00
Fixes an issue where destroy hooks are not set up for `useClass` providers that rely on `forwardRef` for passing the actual class reference. Currently the destroy hooks are not captured because forward refs are not resolved for class providers. In ES2015+ this issue becomes even more critical if arrow-functions are used for e.g. `useClass: () => forwardRef(..)`. This is because arrow functions do not have a prototype, unlike in ES5 where the function assigned to `useClass` would always have a prototype. In ES2015+ a runtime exception as followed is returned (and doesn't give any useful indication of the forwardRef issue): ``` TypeError: Cannot read properties of undefined (reading 'ngOnDestroy') at registerDestroyHooksIfSupported (dist/packages/core/src/render3/di_setup.ts:196:35 <- dist/legacy-test-bundle.spec.js:41508:37) at resolveProvider (dist/packages/core/src/render3/di_setup.ts:153:9 <- dist/legacy-test-bundle.spec.js:41485:11) at resolveProvider (dist/packages/core/src/render3/di_setup.ts:70:7 <- dist/legacy-test-bundle.spec.js:41445:9) at providersResolver (dist/packages/core/src/render3/di_setup.ts:54:5 <- dist/legacy-test-bundle.spec.js:41438:7) at Object.definition.providersResolver (dist/packages/core/src/render3/features/providers_feature.ts:48:18 <- dist/legacy-test-bundle.spec.js:41600:16) at resolveDirectives (dist/packages/core/src/render3/instructions/shared.ts:1179:40 <- dist/legacy-test-bundle.spec.js:35611:17) at elementStartFirstCreatePass (dist/packages/core/src/render3/instructions/element.ts:40:7 <- dist/legacy-test-bundle.spec.js:38432:27) at ɵɵelementStart (dist/packages/core/src/render3/instructions/element.ts:87:7 <- dist/legacy-test-bundle.spec.js:38453:43) at ɵɵelement (dist/packages/core/src/render3/instructions/element.ts:180:3 <- dist/legacy-test-bundle.spec.js:38510:5) at MultipleFormControls_Template (ng:///MultipleFormControls.js:9:9) ``` PR Close #44281 |
||
|---|---|---|
| .. | ||
| i18n | ||
| instructions | ||
| interfaces | ||
| ivy | ||
| jit | ||
| perf | ||
| styling_next | ||
| util | ||
| BUILD.bazel | ||
| change_detection_spec.ts | ||
| common_with_def.ts | ||
| component_ref_spec.ts | ||
| component_spec.ts | ||
| di_spec.ts | ||
| es2015-tsconfig.json | ||
| global_utils_spec.ts | ||
| i18n_debug_spec.ts | ||
| imported_renderer2.ts | ||
| instructions_spec.ts | ||
| integration_spec.ts | ||
| is_shape_of.ts | ||
| is_shape_of_spec.ts | ||
| jit_environment_spec.ts | ||
| listeners_spec.ts | ||
| load_domino.ts | ||
| matchers.ts | ||
| matchers_spec.ts | ||
| metadata_spec.ts | ||
| node_selector_matcher_spec.ts | ||
| perfCounter_spec.ts | ||
| pipe_spec.ts | ||
| providers_es2015_spec.ts | ||
| providers_helper.ts | ||
| providers_spec.ts | ||
| query_spec.ts | ||
| render_util.ts | ||
| renderer_factory_spec.ts | ||
| testing_spec.ts | ||
| utils.ts | ||
| view_container_ref_spec.ts | ||
| view_fixture.ts | ||
| view_utils_spec.ts | ||