Saya berjuang untuk menemukan cara untuk melakukan ini. Dalam komponen induk, template mendeskripsikan a table
dan thead
elemennya, tetapi mendelegasikan rendering tbody
ke komponen lain, seperti ini:
<table>
<thead>
<tr>
<th>Name</th>
<th>Time</th>
</tr>
</thead>
<tbody *ngFor="let entry of getEntries()">
<my-result [entry]="entry"></my-result>
</tbody>
</table>
Setiap komponen myResult membuat tr
tagnya sendiri , pada dasarnya seperti ini:
<tr>
<td>{{ entry.name }}</td>
<td>{{ entry.time }}</td>
</tr>
Alasan saya tidak meletakkan ini secara langsung di komponen induk (menghindari kebutuhan akan komponen myResult) adalah karena komponen myResult sebenarnya lebih rumit daripada yang ditampilkan di sini, jadi saya ingin meletakkan perilakunya dalam komponen dan file terpisah.
DOM yang dihasilkan terlihat buruk. Saya yakin ini karena tidak valid, karena tbody
hanya dapat berisi tr
elemen (lihat MDN) , tetapi DOM yang saya buat (disederhanakan) adalah:
<table>
<thead>
<tr>
<th>Name</th>
<th>Time</th>
</tr>
</thead>
<tbody>
<my-result>
<tr>
<td>Bob</td>
<td>128</td>
</tr>
</my-result>
</tbody>
<tbody>
<my-result>
<tr>
<td>Lisa</td>
<td>333</td>
</tr>
</my-result>
</tbody>
</table>
Apakah ada cara kita bisa mendapatkan hal yang sama diberikan, tetapi tanpa pembungkus <my-result>
tag , dan saat masih menggunakan komponen untuk menjadi satu-satunya yang bertanggung jawab untuk merender baris tabel?
Saya telah melihat ng-content
, DynamicComponentLoader
, yang ViewContainerRef
, tetapi mereka tampaknya tidak memberikan solusi untuk ini sejauh yang saya bisa melihat.
sumber
Jawaban:
Anda dapat menggunakan pemilih atribut
dan kemudian gunakan seperti itu
sumber
[]
? Apakah Anda menambahkan komponen kedeclarations: [...]
modul? Jika komponen terdaftar di modul yang berbeda, apakah Anda menambahkan modul lain ini keimports: [...]
modul tempat Anda ingin menggunakan komponen tersebut?setAttribute
bukan kode saya. Tapi saya sudah menemukannya, saya perlu menggunakan tag tingkat atas yang sebenarnya di template saya sebagai tag untuk komponen saya alih-alihng-container
jadi penggunaan baru yang berfungsi<ul smMenu class="nav navbar-nav" [submenus]="root?.Submenus" [title]="root?.Title"></ul>
<ul class="nav navbar-nav"> <li-navigation [navItems]="menuItems"></li-navigation> </ul>
Saya menggunakan ini (setelah mengubah navigasi-li ke pemilih atribut)<ul class="nav navbar-nav" li-navigation [navItems]="menuItems"></ul>
Anda memerlukan "ViewContainerRef" dan di dalam komponen hasil-saya melakukan sesuatu seperti ini:
html:
ts:
sumber
@ViewChild('template', {static: true}) template;
my-result
harus dapat membuatmy-result
saudara baru . Jadi, bayangkan Anda memiliki hierarki dimy-result
mana setiap baris dapat memiliki baris "turunan". Dalam hal ini, menggunakan selektor atribut tidak akan berfungsi, karena selektor pertama masuk ketbody
, tetapi selektor kedua tidak bisa masuk internaltbody
atau atr
.Gunakan arahan ini di elemen Anda
Contoh penggunaan:
dan di html induk Anda memanggil elemen kartu seperti biasa, misalnya:
Outputnya adalah:
sumber
Pemilih atribut adalah cara terbaik untuk mengatasi masalah ini.
Jadi dalam kasus Anda:
hasil saya ts
html hasil-saya
hasil saya ts
html hasil saya
Lihat stackblitz yang berfungsi: https://stackblitz.com/edit/angular-xbbegx
sumber
Anda dapat mencoba menggunakan css baru
display: contents
inilah scss toolbar saya:
dan html:
dan sedang digunakan:
sumber
Pilihan lain saat ini adalah yang
ContribNgHostModule
disediakan dari@angular-contrib/common
paket .Setelah mengimpor modul, Anda dapat menambahkan
host: { ngNoHost: '' }
ke@Component
dekorator Anda dan tidak ada elemen pembungkus yang akan dirender.sumber