angular - ngx-datatable row-detail 中的动态组件
问题描述
我正在使用 ngx-datatable 创建一个可重用的数据表,并且我希望在行详细信息中呈现动态组件。数据表组件从父模块接收组件类作为参数,我使用 ComponentFactory 来创建组件。我可以看到构造函数和 onInit 方法正在为动态组件运行,但它没有附加到 DOM。
这是 row-detail 的数据表 html 的样子:
<!-- [Row Detail Template] -->
<ngx-datatable-row-detail rowHeight="100" #myDetailRow (toggle)="onDetailToggle($event)">
<ng-template let-row="row" #dynamicPlaceholder let-expanded="expanded" ngx-datatable-row-detail-template>
</ng-template>
</ngx-datatable-row-detail>
<!-- [/Row Detail Template] -->
这就是我的 .ts 文件的样子:
@ViewChild('myDetailRow', {static: true, read: ViewContainerRef}) myDetailRow: ViewContainerRef;
@ViewChild('dynamicPlaceholder', {static: true, read: ViewContainerRef}) dynamicPlaceholder: ViewContainerRef;
renderDynamicComponent(component) {
var componentFactory = this.componentFactoryResolver.resolveComponentFactory(component);
var hostViewConRef1 = this.myDetailRow;
var hostViewConRef2 = this.dynamicPlaceholder;
hostViewConRef1.createComponent(componentFactory);
hostViewConRef2.createComponent(componentFactory);
}
另一点是,如果我的#dynamicPlaceholder
ng-template 放在 ngx-datatable 之外,它可以工作并且动态模块被渲染和显示。
解决方案
我们不能<ng-template>
在运行时将组件渲染到模板()中,createComponent
因为 afaik 模板在编译时由 Angular 处理。所以我们需要一个在编译时工作的解决方案。
有缺点的解决方案
ng-content
可以在这里帮助我们:
<!-- [Row Detail Template] -->
<ngx-datatable-row-detail rowHeight="100" (toggle)="onDetailToggle($event)">
<ng-template let-row="row" let-expanded="expanded" ngx-datatable-row-detail-template>
<ng-content></ng-content>
</ng-template>
</ngx-datatable-row-detail>
<!-- [/Row Detail Template] -->
然后我们可以将任何我们想要的东西传递给细节视图:
<my-table>From the ouside but I cant access the current row :(</my-table>
但是有一个问题:ng-content
当我们想访问传递的模板中的当前行时,我们不能使用。
解决方案
但ngx-datatable
让我们得到了保障。我们可以将模板传递给ngx-datatable-row-detail
指令:
<ngx-datatable-row-detail [template]="myDetailTemplate "rowHeight="100" (toggle)="onDetailToggle($event)">
</ngx-datatable-row-detail>
然后可以通过@Input
变量从外部的任何组件传入模板:
<ng-template #myDetailTemplate let-row="row">
From the outside with access to the current row: {{row.name}}
</ng-template>
看一下stackblitz,我在其中编写了一个my-table
poc 组件。
推荐阅读
- java - 如何使用 Spring Java 应用程序使 IBM MQ 侦听器进程缓慢
- c++ - 我正在尝试将浮点数四舍五入到小数点后两位,但这是不正确的。如何在 C++ 中修复此舍入错误?
- c# - 如何从程序向 SqlServer 和 MySql 发送查询?
- python - 我们如何获取长整数的用户输入?
- angular - 从 Angular 客户端将文件上传到 Amazon S3?
- arrays - Swift Collection <__NSCFSet: 0x161174110> 在枚举时发生了变异
- excel - 用另一个矩形的图像填充替换矩形图像填充
- java - 在哪个领域使用 OSGI 有意义?
- xml - 基于使用情况的 XML Schema 元素限制
- django-rest-framework - 如何获取manytomanyfield相关模型的所有属性列表?