【发布时间】:2021-07-25 07:50:13
【问题描述】:
使用 JitCompilerFactory 并在运行时编译组件有效(例如,请参见此处:https://stackoverflow.com/a/67122569/15816951)但注入动态组件不起作用:
// (1) define Component metadata
const metadata = new Component({
selector: "dynamic-selector",
template: "This is template: {{text}}" // <---- Interpolation: works
});
// (2) define Component class and decorate
const compClass = class DynamicComponent {
text: string = 'from'; // <---- Interpolation: works
constructor(public s: Service1) { } // <---- Trying to inject a service: FAILS
};
const decoratedComp = Component(metadata)(compClass);
// (3) define Module class and decorate
const decoratedModule = NgModule({
imports: [...],
declarations: [decoratedCmp]
})(class DynamicModule { })
// (4 )compile Module and grab the Component Factory
const module = compiler.compileModuleAndAllComponentsAsync(decoratedModule);
const factory = module.componentFactories.find(x => x.componentType === decoratedCmp);
// (5) render the component using Component Factory
someViewContainerRef.createComponent(factory);
没有组件类构造函数中的 DI(上面的#2)一切都很好,但尝试注入原因:
core.js:6210 ERROR 错误:未捕获(在承诺中):错误:此构造函数与 Angular 依赖注入不兼容,因为它在参数列表索引 0 处的依赖无效。
如果依赖类型是像字符串这样的原始类型,或者此类的祖先缺少 Angular 装饰器,则可能会发生这种情况。
请检查 1) 索引 0 处的参数类型是否正确,以及 2) 为此类及其祖先定义了正确的 Angular 装饰器。 错误:此构造函数与 Angular 依赖注入不兼容,因为它在参数列表索引 0 处的依赖无效。 如果依赖类型是像字符串这样的原始类型,或者此类的祖先缺少 Angular 装饰器,则可能会发生这种情况。
根据 Angular 团队对 Angular 9 的回答,我尝试在 polyfills.ts 中添加 core-js/es/reflect 和 reflect-metadata:https://github.com/angular/angular/issues/35908(使用 AoT 编译的 Ivy 项目中的 JIT 时出现 DI 错误)。
我应该怎么做才能使 DI 对 Angular 11 中的动态组件起作用?
【问题讨论】:
标签: angular dependency-injection angular-ivy dynamic-compilation