使用Injector.create()创建嵌入式视图注入器时父注入器失效问题
问题解决:嵌入式视图自定义注入器无法继承父注入器服务
核心问题是传递注入器的方式错误:TemplateRef.createEmbeddedView的第二个参数是配置选项对象,而非直接传入注入器,你需要将自定义注入器放在选项的injector属性中。
修正后的代码
- 保持自定义注入器的创建逻辑不变:
const myInjector = Injector.create({ providers: [ { provide: MyService, useFactory: () => new MyService(), }, ], parent: this.vcr.injector, });
- 正确传递注入器到嵌入式视图:
const view = this.template.createEmbeddedView( null, { injector: myInjector } // 将注入器放在options对象的injector属性中 );
无自定义Provider的场景
如果不需要添加自定义provider,你可以:
- 显式指定父注入器:
const view = this.template.createEmbeddedView(null, { injector: this.vcr.injector });
- 或者不指定
injector选项,Angular会默认使用模板关联的注入器(即this.vcr.injector):
const view = this.template.createEmbeddedView(null);
问题原因说明
之前的代码错误地将注入器直接作为第二个参数(上下文对象)传递,Angular会把它当作模板上下文数据处理,而非注入器配置。此时自定义注入器虽然能提供MyService,但无法正确继承父注入器的服务链,导致模板无法获取this.vcr.injector中的服务。
内容的提问来源于stack exchange,提问作者Raziel
相关产品推荐
相关产品推荐

