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];
...