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 #dynamicPlaceholderplantilla 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óncreateComponentporque 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-contentpuede ayudarnos aquí:Luego podemos pasar lo que queramos a la vista detallada:
Pero hay un problema: no podemos usar
ng-contentcuando queremos acceder a la fila actual en la plantilla aprobada.Solución
Pero
ngx-datatablenos cubrió. Podemos pasar una plantilla a langx-datatable-row-detaildirectiva:La plantilla se puede pasar desde cualquier componente en el exterior a través de una
@Inputvariable:Eche un vistazo a stackblitz , donde escribí un
my-tablecomponente como poc.fuente
Stackblitz
Editar: jugué con la
ngx-datatablefuente, la parte triste de élngx-datatable-row-detailno es un componente sino una directiva y no está asociada al DOM. Entonces no tieneViewContainerref. Esto hace que inyectarle elementos sea un poco difícil. Lo que puede hacer es definir plantillas en su componente y usarTemplateRefsy asignarlas donde representa su componente.fuente
el.setAttribute is not a functionerror 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?