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

Angular 6:JIT编译动态组件无法注入服务的问题

解决JIT动态组件注入ApplicantSvc的依赖解析错误

这个问题的核心在于Angular JIT编译器需要明确的依赖元数据,而动态创建的组件/类可能因为元数据丢失或者装饰器使用不当,导致无法解析注入参数。下面是具体的修复步骤:

1. 修正ApplicantSvc的@Injectable装饰器写法

你当前的@Injectable缺少括号,这会导致Angular无法正确识别这是一个可注入的服务。正确的写法应该是:

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root' // 推荐使用root提供,这样整个应用都能访问,也可以保留动态模块的providers配置
})
export class ApplicantSvc {
  name: string;
}

2. 给动态组件的构造函数参数显式添加@Inject装饰器

动态创建的匿名类在JIT编译时,类型元数据可能无法被正确获取,所以需要显式指定依赖类型:
首先导入Inject:

import { Inject, Component, NgModule, CommonModule } from '@angular/core';

然后修改动态组件的定义:

const tmpCmp = Component({ template })(class {
  constructor(@Inject(ApplicantSvc) private app: ApplicantSvc) {}
});

3. 确保TypeScript配置保留装饰器元数据

检查你的tsconfig.json,确保emitDecoratorMetadata设置为true,这是JIT编译器获取依赖类型的关键:

{
  "compilerOptions": {
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true, // 通常这个也要开启
    // 其他编译配置...
  }
}

额外验证:检查注入器的层级

你在动态模块的providers中已经添加了ApplicantSvc,同时使用this.injector来创建组件,确保这个注入器的层级能够访问到该服务。如果你的根注入器已经通过providedIn: 'root'提供了服务,那么动态模块的providers可以不用重复添加(当然添加也没问题,会覆盖模块层级的实例)。

完成以上步骤后,JIT编译器就能正确解析ApplicantSvc的依赖注入,不会再出现Can't resolve all parameters的错误了。

内容的提问来源于stack exchange,提问作者user2894836

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:03:32