Saya membuat datatable dapat digunakan kembali menggunakan ngx-datatable dan saya ingin memiliki komponen dinamis yang dirender di dalam detail baris. Komponen datatable menerima kelas komponen sebagai argumen dari modul induk dan saya menggunakan ComponentFactory untuk membuatComponent. Saya dapat melihat bahwa konstruktor dan metode onInit berjalan untuk komponen dinamis tetapi tidak dilampirkan ke DOM.
Inilah tampilan dari html yang dapat datatable untuk detail baris:
<!-- [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] -->
Dan inilah tampilan file .ts saya:
@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);
}
Poin lain adalah bahwa jika #dynamicPlaceholder
template-ng saya ditempatkan di luar ngx-datatable, ia berfungsi dan modul dinamis di-render dan ditampilkan.
angular
ngx-datatable
Raghav Kanwal
sumber
sumber
<ng-content>
tag untuk memberikan markup bersarang.Jawaban:
Kami tidak dapat merender komponen menjadi Templat (
<ng-template>
) saat runtime dengancreateComponent
karena templat afaik diproses oleh Angular pada waktu kompilasi. Jadi kita membutuhkan solusi yang berfungsi pada waktu kompilasi.
Solusi dengan kekurangan
ng-content
dapat membantu kami di sini:Kami kemudian dapat melewatkan apa pun yang kami inginkan ke tampilan detail:
Tetapi ada masalah: Kita tidak bisa menggunakan
ng-content
ketika kita ingin mengakses baris saat ini di templat yang diteruskan.Larutan
Tetapi
ngx-datatable
membuat kami terlindungi. Kami dapat mengirimkan templat kengx-datatable-row-detail
arahan:Template kemudian dapat ditularkan dari komponen di luar melalui
@Input
variabel:Lihatlah stackblitz , di mana saya menulis
my-table
komponen sebagai poc.sumber
Stackblitz
Sunting: Saya mengutak-atik
ngx-datatable
bagian sumber sedih itungx-datatable-row-detail
bukan komponen tetapi arahan dan tidak melekat pada DOM. Jadi tidak adaViewContainer
referensi. Ini membuat elemen injeksi menjadi sedikit sulit. Yang dapat Anda lakukan adalah mendefinisikan templat di komponen Anda dan menggunakanTemplateRef
s dan menugaskan mereka di mana Anda membuat komponen Anda.sumber
el.setAttribute is not a function
kesalahan pada metode componentFactory.create. Adakah yang tahu mengapa itu bisa terjadi? this.dynamicPlaceholder.elementRef.nativeElement mengembalikan komentar, mungkinkah itu?