Angular 7:模态框无服务提供问题——多态服务注入方案咨询
解决Angular模态框无法注入父组件多态服务的问题
你猜的完全正确!Angular的MatDialog打开的模态框默认是挂载到根注入器上下文的,它脱离了父组件(UserDetailsComponent)的DI树,所以没法自动获取到父组件里通过providers配置的多态服务。下面给你两种简单可行的解决方案:
方法一:传入父组件的注入器(推荐)
在打开模态框时,显式传入父组件的Injector,让模态框使用父组件的DI上下文来解析依赖:
- 首先在父组件
UserDetailsComponent中注入Injector:
constructor( private dialog: MatDialog, private injector: Injector // 注入当前组件的注入器 ) {}
- 打开模态框时,在配置中指定
injector属性:
openRoleSelectorModal() { this.dialog.open(RoleSelectorComponent, { data: { /* 你的模态框数据 */ } as RoleSelectorModalInput, injector: this.injector // 关键:让模态框复用父组件的DI环境 }); }
这样模态框的构造函数就能正常注入GenericRolesService(也就是你配置的UserRolesService实例)了。
方法二:在对话框配置中直接提供服务
如果不想传入整个注入器,也可以在打开模态框时,单独把父组件的服务实例提供给对话框:
- 在父组件中注入目标服务(因为你用了
useExisting,注入GenericRolesService或UserRolesService都可以):
constructor( private dialog: MatDialog, private genericRolesService: GenericRolesService ) {}
- 打开模态框时,在配置的
providers中添加服务映射:
openRoleSelectorModal() { this.dialog.open(RoleSelectorComponent, { data: { /* 你的模态框数据 */ } as RoleSelectorModalInput, providers: [ { provide: GenericRolesService, useValue: this.genericRolesService } ] }); }
这种方式相当于给模态框单独配置了一个服务提供者,直接复用父组件的服务实例。
为什么会出现这个问题?
Angular Material的对话框默认会将组件加载到应用的根视图容器中,它的依赖解析链是从根注入器开始向上查找,而不是从触发它的父组件注入器开始。所以父组件中配置的providers默认对模态框不可见,必须通过上述方式显式传递DI上下文或服务实例。
内容的提问来源于stack exchange,提问作者JME
相关产品推荐
相关产品推荐

