You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Injector.create()创建嵌入式视图注入器时父注入器失效问题

问题解决:嵌入式视图自定义注入器无法继承父注入器服务

核心问题是传递注入器的方式错误:TemplateRef.createEmbeddedView的第二个参数是配置选项对象,而非直接传入注入器,你需要将自定义注入器放在选项的injector属性中。

修正后的代码

  1. 保持自定义注入器的创建逻辑不变:
const myInjector = Injector.create({
    providers: [
        {
            provide: MyService,
            useFactory: () => new MyService(),
        },
    ],
    parent: this.vcr.injector,
});
  1. 正确传递注入器到嵌入式视图:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 02:29:55