Je crée une table de données réutilisable en utilisant ngx-datatable et je voudrais que les composants dynamiques soient rendus à l'intérieur du détail de la ligne. Le composant datatable reçoit une classe de composant comme argument d'un module parent et j'utilise ComponentFactory pour créerComponent. Je peux voir que le constructeur et les méthodes onInit sont en cours d'exécution pour le composant dynamique mais qu'il n'est pas attaché au DOM.
Voici à quoi ressemble le HTML datatable pour le détail de la ligne:
<!-- [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] -->
Et voici à quoi ressemble mon fichier .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);
}
Un autre point est que si mon #dynamicPlaceholder
modèle ng est placé en dehors de ngx-datatable, cela fonctionne et le module dynamique est rendu et affiché.
angular
ngx-datatable
Raghav Kanwal
la source
la source
<ng-content>
balise pour restituer tout balisage imbriqué.Réponses:
Nous ne pouvons pas rendre un composant dans un Template (
<ng-template>
) au moment de l'exécution aveccreateComponent
car les modèles afaik sont traités par Angular au moment de la compilation. Nous avons donc besoin d'une solution qui fonctionne au moment de la compilation.
Solution avec des inconvénients
ng-content
peut nous aider ici:Nous pouvons ensuite passer tout ce que nous voulons à la vue de détail:
Mais il y a un problème: nous ne pouvons pas l'utiliser
ng-content
lorsque nous voulons accéder à la ligne actuelle dans le modèle passé.Solution
Mais
ngx-datatable
nous a couverts. Nous pouvons passer un modèle à langx-datatable-row-detail
directive:Le modèle peut ensuite être transmis depuis n'importe quel composant extérieur via une
@Input
variable:Jetez un oeil au stackblitz , où j'ai écrit un
my-table
composant comme poc.la source
Stackblitz
Edit: j'ai tripoté la
ngx-datatable
source avec une triste partie, cengx-datatable-row-detail
n'est pas un composant mais une directive et elle n'est pas attachée au DOM. Il n'a donc pas deViewContainer
réf. Cela rend l'injection d'éléments un peu difficile. Ce que vous pouvez faire, c'est définir des modèles dans votre composant et utiliserTemplateRef
s et les affecter à l'endroit où vous rendez votre composant.la source
el.setAttribute is not a function
erreur sur la méthode componentFactory.create. Une idée de pourquoi cela peut arriver? this.dynamicPlaceholder.elementRef.nativeElement renvoie un commentaire, est-ce possible?