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.
angular
ngx-datatable
Raghav Kanwal
fonte
fonte
<ng-content>
marca para renderizar qualquer marcação aninhada.Respostas:
Não podemos renderizar um componente em um Template (
<ng-template>
) em tempo de execuçãocreateComponent
porque os modelos afaik são processados pelo Angular em tempo de compilação. Portanto, precisamos de uma solução que funcione em tempo de compilação.
Solução com desvantagens
ng-content
pode nos ajudar aqui:Podemos então passar o que queremos para a visualização de detalhes:
Mas há um problema: não podemos usar
ng-content
quando queremos acessar a linha atual no modelo passado.Solução
Mas
ngx-datatable
nos cobrimos. Podemos passar um modelo para angx-datatable-row-detail
diretiva:O modelo pode ser passado a partir de qualquer componente externo através de uma
@Input
variável:Dê uma olhada no stackblitz , onde escrevi um
my-table
componente como poc.fonte
Stackblitz
Edit: Eu brinquei com
ngx-datatable
fonte triste parte delengx-datatable-row-detail
não é um componente, mas diretiva e não está ligado ao DOM. Portanto, não temViewContainer
ref. Isso dificulta um pouco a injeção de elementos nele. O que você pode fazer é definir modelos em seu componente e usarTemplateRef
s e atribuí-los onde você renderiza seu componente.fonte
el.setAttribute is not a function
erro no método componentFactory.create. Alguma idéia de por que isso pode estar acontecendo? this.dynamicPlaceholder.elementRef.nativeElement retorna um comentário, poderia ser isso?