嵌套模态框组件服务注入问题:能否重提供不覆写同token服务且关闭后恢复原实例?
关于嵌套模态框中服务注入的两个问题解答
问题1:能否为嵌套模态对话框组件重新提供某服务,且不覆盖已有的同token服务?
完全可以。Angular的依赖注入系统是层级化的:当你在模态对话框组件(比如B)的providers数组中重新注册同token的服务Z时,这个新的服务实例只会在B组件及其子组件的注入器范围内生效。上层组件(比如A)的注入器仍然会使用原本注册的服务Z实例,不会被覆盖。
举个代码示例:
// 组件B的配置 @Component({ selector: 'app-modal-b', templateUrl: './modal-b.component.html', providers: [ { provide: Z_SERVICE_TOKEN, useClass: ZService } // 在组件层级重新提供服务 ] }) export class ModalBComponent { constructor(@Inject(Z_SERVICE_TOKEN) private zService: ZService) { // 此处注入的是组件B专属的全新ZService实例 } }
组件A中注入的ZService,依然是应用根层级或A所在层级的原始实例,和B中的实例互不干扰。
问题2:关闭对话框B后,嵌套的服务Z是否会被“释放”,A组件能否恢复使用原始服务Z?
是的,嵌套的服务Z实例会被释放,A组件会自动恢复使用原始的服务Z实例。
原因在于:Angular组件销毁时,其对应的组件级注入器也会被销毁,该注入器下创建的服务实例(比如B里的ZService)会被Angular的垃圾回收机制清理。而组件A的注入器层级完全独立于B,所以B关闭销毁后,A的依赖注入链路不受任何影响,仍然会获取原本的服务Z实例。
需要注意:如果服务Z是通过providedIn: 'root'注册的根服务,必须在B组件的providers里显式重新提供,才能生成新实例;如果是在某个父组件层级提供的服务,同样在B的providers里重新注册即可覆盖当前层级的注入。
内容的提问来源于stack exchange,提问作者rubmz
相关产品推荐
相关产品推荐

