Angular 角9常春藤入口组件转换 @组件({ 选择器:“动态”, 模板:“”, //常春藤前的入口组件 entryComponents:[组件1、组件2、组件3] }) 类DynamicComponent(){ 门户:组件门户[]=[]; 构造函数(@Inject(COMPONENTS_TOKEN)COMPONENTS:T[]){ //像这样的 this.portals=components.map(c=>newcomponentportal(c)); } } @NGD模块({ 声明:[ 动态组件 组成部分1, 组成部分2, 组成部分3, ], 导入:[PortalModule、CommonModule、MyOtherModule] })

Angular 角9常春藤入口组件转换 @组件({ 选择器:“动态”, 模板:“”, //常春藤前的入口组件 entryComponents:[组件1、组件2、组件3] }) 类DynamicComponent(){ 门户:组件门户[]=[]; 构造函数(@Inject(COMPONENTS_TOKEN)COMPONENTS:T[]){ //像这样的 this.portals=components.map(c=>newcomponentportal(c)); } } @NGD模块({ 声明:[ 动态组件 组成部分1, 组成部分2, 组成部分3, ], 导入:[PortalModule、CommonModule、MyOtherModule] }),angular,angular9,angular-ivy,Angular,Angular9,Angular Ivy,我有一个类似于上面的组件,我使用ComponentPortal和cdkPortalOutlet动态创建它。DynamicComponent本身有许多它创建的插座和组件。在前面的entryComponents中,我会列出可以加载到DynamicComponentsoutlets中的每个组件。这正如预期的那样起作用,但现在升级到Ivy并删除不推荐的entryComponents,这就不再起作用了。我创建了DynamicComponent,它初始化得很好,但是DynamicComponent内部的组件

我有一个类似于上面的组件,我使用
ComponentPortal
cdkPortalOutlet
动态创建它。
DynamicComponent
本身有许多它创建的插座和组件。在前面的
entryComponents
中,我会列出可以加载到
DynamicComponents
outlets中的每个组件。这正如预期的那样起作用,但现在升级到Ivy并删除不推荐的
entryComponents
,这就不再起作用了。我创建了
DynamicComponent
,它初始化得很好,但是
DynamicComponent
内部的组件似乎没有被创建,并导致整个
DynamicComponent
的渲染失败。如果我移除
DynamicComponent
中的插座,则
DynamicComponent
中的所有其他内容都会呈现良好效果

我的想法是,创建DynamicComponent时,不会解析DynamicComponent的依赖项组件。依赖项组件不用于任何其他角度组件。在如何将旧的entryComponent行为转换为使用Ivy方面,我是否遗漏了一些内容

编辑:
“buildOptimizer”:false
修复了它,但理想情况下希望保持此功能。

您可以在
DynamicComponent
类中创建一个
entryComponents
数组,在其中列出未在其他地方引用的组件,例如:

@Component({
   selector: 'dynamic',
   template: '<ng-template *ngFor="let portal of portals" [cdkPortalOutlet]="portal"></ng-template>',
   // entryComponents before Ivy
   entryComponents: [Component1, Component2, Component3]
})
class DynamicComponent<T extends BaseComponentClass>() {
    portals: ComponentPortal<any>[] = [];

    constructor(@Inject(COMPONENTS_TOKEN) components: T[]) {
        // Something like this
        this.portals = components.map(c => new ComponentPortal(c));
    }
}

@NgModule({
    declarations: [
        DynamicComponent
        Component1,
        Component2,
        Component3,
    ],
    imports: [PortalModule, CommonModule, MyOtherModule]
})
类DynamicComponent(){
entryComponents=[Component1,Component2,Component3];
...
组件被引用的事实将防止它们被树震动,即使变量没有用于任何用途。请参阅关于此类问题和可能解决方案的有趣讨论

class DynamicComponent<T extends BaseComponentClass>() {
    entryComponents = [Component1, Component2, Component3];
    ...