Estoy creando una tabla de datos reutilizable usando ngx-datatable y me gustaría tener componentes dinámicos representados dentro de los detalles de la fila. El componente de tabla de datos recibe una clase de componente como argumento de un módulo principal y yo uso ComponentFactory para crear un Componente. Puedo ver que el constructor y los métodos onInit se están ejecutando para el componente dinámico, pero no se está adjuntando al DOM.
Así es como se ve el html de la tabla de datos para el detalle de fila:
<!-- [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] -->
Y así es como se ve mi archivo .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);
}
Otro punto es que si mi #dynamicPlaceholder
plantilla ng se coloca fuera de ngx-datatable, funciona y el módulo dinámico se representa y se muestra.
angular
ngx-datatable
Raghav Kanwal
fuente
fuente
<ng-content>
etiqueta para representar cualquier marcado anidado.Respuestas:
No podemos representar un componente en una Plantilla (
<ng-template>
) en tiempo de ejecucióncreateComponent
porque Angular procesa las plantillas afaik en tiempo de compilación. Por lo tanto, necesitamos una solución que funcione en tiempo de compilación.
Solución con inconvenientes
ng-content
puede ayudarnos aquí:Luego podemos pasar lo que queramos a la vista detallada:
Pero hay un problema: no podemos usar
ng-content
cuando queremos acceder a la fila actual en la plantilla aprobada.Solución
Pero
ngx-datatable
nos cubrió. Podemos pasar una plantilla a langx-datatable-row-detail
directiva:La plantilla se puede pasar desde cualquier componente en el exterior a través de una
@Input
variable:Eche un vistazo a stackblitz , donde escribí un
my-table
componente como poc.fuente
Stackblitz
Editar: jugué con la
ngx-datatable
fuente, la parte triste de élngx-datatable-row-detail
no es un componente sino una directiva y no está asociada al DOM. Entonces no tieneViewContainer
ref. Esto hace que inyectarle elementos sea un poco difícil. Lo que puede hacer es definir plantillas en su componente y usarTemplateRef
sy asignarlas donde representa su componente.fuente
el.setAttribute is not a function
error en el método componentFactory.create. ¿Alguna idea de por qué eso puede estar sucediendo? this.dynamicPlaceholder.elementRef.nativeElement devuelve un comentario, ¿podría ser eso?