目前的官方文档仅显示如何动态 change 组件 <ng-template>
标签 . https://angular.io/guide/dynamic-component-loader
我想要实现的是,假设我有3个组件: header
, section
和 footer
以及以下选择器:
<app-header>
<app-section>
<app-footer>
然后有6个按钮可以添加或删除每个组件: Add Header
, Add Section
和 Add Footer
当我单击 Add Header
时,该页面会将 <app-header>
添加到呈现它的页面,因此该页面将包含:
<app-header>
然后如果我单击 Add Section
两次,该页面现在将包含:
<app-header>
<app-section>
<app-section>
如果我单击 Add Footer
,页面将包含所有这些组件:
<app-header>
<app-section>
<app-section>
<app-footer>
是否有可能在Angular中实现这一目标?请注意 ngFor
不是我正在寻找的解决方案,因为它只允许向页面添加相同的组件,而不是不同的组件 .
编辑:ngIf和ngFor不是我正在寻找的解决方案,因为模板已经预先确定 . 我正在寻找的东西就像是一堆组件或一组组件,我们可以轻松地添加,删除和更改数组的任何索引 .
编辑2:为了更清楚,让我们有另一个例子说明为什么ngFor不起作用 . 假设我们有以下组件:
<app-header>
<app-introduction>
<app-camera>
<app-editor>
<app-footer>
现在出现了一个新组件 <app-description>
,用户希望在其中插入 <app-editor>
. ngFor只有在我想要循环遍历的同一个组件时才有效 . 但是对于不同的组件,ngFor在这里失败了 .
2 回答
您尝试实现的目标可以通过使用
ComponentFactoryResolver
动态创建组件然后将它们注入ViewContainerRef
来完成 . 动态执行此操作的一种方法是将组件的类作为函数的参数传递,该函数将创建并注入组件 .见下面的例子:
笔记:
如果您希望以后更容易删除组件,可以在局部变量中跟踪它们,请参阅
this.components
. 或者,您可以遍历ViewContainerRef
中的所有元素 .您必须将组件注册为条目组件 . 在模块定义中,将组件注册为entryComponent(
entryComponents: [DraggableComponent]
) .运行示例:https://plnkr.co/edit/mrXtE1ICw5yeIUke7wl5
有关更多信息:https://angular.io/guide/dynamic-component-loader
我创建了一个演示来显示动态添加和删除过程 . 父组件动态创建子组件并将其删除 .
点击进行演示
Parent Component
Child Component
添加对 app.module.ts 的引用