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
相关产品推荐
相关产品推荐

