Tworzę plik danych wielokrotnego użytku za pomocą ngx-datatable i chciałbym, aby dynamiczne komponenty były renderowane wewnątrz szczegółów wiersza. Składnik danych otrzymuje klasę składnika jako argument z modułu nadrzędnego i używam ComponentFactory do utworzenia składnika. Widzę, że konstruktor i metody onInit działają dla komponentu dynamicznego, ale nie jest on dołączany do DOM.
Tak wygląda html z datacją dla szczegółów wiersza:
<!-- [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] -->
I tak wygląda mój plik .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);
}
Inną kwestią jest to, że jeśli mój #dynamicPlaceholder
szablon ng jest umieszczony poza ngx-datatable, to działa, a moduł dynamiczny jest renderowany i wyświetlany.
angular
ngx-datatable
Raghav Kanwal
źródło
źródło
<ng-content>
znacznik do renderowania zagnieżdżonego znacznika.Odpowiedzi:
Nie możemy renderować komponentu w szablonie (
<ng-template>
) w czasie wykonywania,createComponent
ponieważ szablony afaik są przetwarzane przez Angular w czasie kompilacji. Potrzebujemy więc rozwiązania, które działa w czasie kompilacji.
Rozwiązanie z wadami
ng-content
może nam pomóc tutaj:Następnie możemy przekazać wszystko, co chcemy, do widoku szczegółów:
Ale jest problem: nie możemy użyć,
ng-content
gdy chcemy uzyskać dostęp do bieżącego wiersza w przekazanym szablonie.Rozwiązanie
Ale
ngx-datatable
nas ochronił. Możemy przekazać szablon dongx-datatable-row-detail
dyrektywy:Szablon można następnie przekazać z dowolnego komponentu na zewnątrz za pomocą
@Input
zmiennej:Spójrz na stackblitz , w którym napisałem
my-table
komponent jako poc.źródło
Stackblitz
Edycja: bałem się, że jego
ngx-datatable
źródłowa część niengx-datatable-row-detail
jest komponentem, lecz dyrektywą i nie jest dołączona do DOM. Więc nie maViewContainer
ref. To sprawia, że wstrzykiwanie do niego elementów jest trochę trudne. Możesz zdefiniować szablony w komponencie i użyćTemplateRef
s oraz przypisać je tam, gdzie renderujesz komponent.źródło
el.setAttribute is not a function
błąd w metodzie componentFactory.create. Masz pojęcie, dlaczego tak się dzieje? this.dynamicPlaceholder.elementRef.nativeElement zwraca komentarz, czy to może być?