Estou criando uma tabela de dados reutilizável usando ngx-datatable e gostaria de ter componentes dinâmicos renderizados dentro dos detalhes da linha. O componente de tabela de dados recebe uma classe de componente como argumento de um módulo pai e eu uso ComponentFactory para createComponent. Percebo que o construtor e os métodos onInit estão em execução para o componente dinâmico, mas ele não está sendo anexado ao DOM.
É assim que o html da tabela de dados se parece com os detalhes da linha:
<!-- [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] -->
E é assim que meu arquivo .ts se parece:
@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);
}
Outro ponto é que, se meu #dynamicPlaceholder
ng-template for colocado fora da ngx-datatable, ele funcionará e o módulo dinâmico será renderizado e exibido.
<ng-content>
marca para renderizar qualquer marcação aninhada.