Saya perlu menggunakan ng-repeat
(dalam AngularJS) untuk mendaftar semua elemen dalam sebuah array.
Komplikasinya adalah bahwa setiap elemen array akan berubah menjadi satu, dua atau tiga baris tabel.
Saya tidak dapat membuat html yang valid, jika ng-repeat
digunakan pada suatu elemen, karena tidak ada jenis elemen berulang yang diizinkan antara <tbody>
dan <tr>
.
Misalnya, jika saya menggunakan ng-repeat <span>
, saya akan mendapatkan:
<table>
<tbody>
<span>
<tr>...</tr>
</span>
<span>
<tr>...</tr>
<tr>...</tr>
<tr>...</tr>
</span>
<span>
<tr>...</tr>
<tr>...</tr>
</span>
</tbody>
</table>
Yang html tidak valid.
Tapi yang perlu saya hasilkan adalah:
<table>
<tbody>
<tr>...</tr>
<tr>...</tr>
<tr>...</tr>
<tr>...</tr>
<tr>...</tr>
<tr>...</tr>
</tbody>
</table>
di mana baris pertama telah dihasilkan oleh elemen array pertama, tiga berikutnya oleh yang kedua dan kelima dan keenam oleh elemen array terakhir.
Bagaimana saya bisa menggunakan ng-repeat sedemikian rupa sehingga elemen html yang terikat 'menghilang' selama rendering?
Atau adakah solusi lain untuk ini?
Klarifikasi: Struktur yang dihasilkan akan terlihat seperti di bawah ini. Setiap elemen array dapat menghasilkan antara 1-3 baris tabel. Jawabannya idealnya mendukung 0-n baris per elemen array.
<table>
<tbody>
<!-- array element 0 -->
<tr>
<td>One row item</td>
</tr>
<!-- array element 1 -->
<tr>
<td>Three row item</td>
</tr>
<tr>
<td>Some product details</td>
</tr>
<tr>
<td>Customer ratings</td>
</tr>
<!-- array element 2 -->
<tr>
<td>Two row item</td>
</tr>
<tr>
<td>Full description</td>
</tr>
</tbody>
</table>
tr
saya akan mendapatkan satu baris per elemen array, sejauh yang saya mengerti.tr
s yang dihasilkan oleh satu elemen array tidak memiliki struktur yang sama.Jawaban:
Pembaruan: Jika Anda menggunakan Angular 1.2+, gunakan ng-repeat-start . Lihat jawaban @ jmagnusson.
Kalau tidak, bagaimana kalau Anda mengulangi ng-ngulang? (AFAIK, tidak apa-apa untuk memiliki beberapa <tbody> dalam satu tabel.)
sumber
Pada AngularJS 1.2 ada arahan
ng-repeat-start
yang melakukan apa yang Anda minta. Lihat jawaban saya dalam pertanyaan ini untuk deskripsi tentang bagaimana menggunakannya.sumber
Jika Anda menggunakan ng> 1.2, berikut adalah contoh penggunaan
ng-repeat-start/end
tanpa membuat tag yang tidak perlu:Poin penting: untuk tag yang digunakan
ng-repeat-start
danng-repeat-end
diaturng-if="0"
, agar tidak dimasukkan dalam halaman. Dengan cara ini, konten batin akan ditangani persis seperti di knockoutjs (menggunakan perintah di<!--...-->
), dan tidak akan ada sampah.sumber
Anda mungkin ingin meratakan data dalam pengontrol Anda:
Dan kemudian di HTML:
sumber
ng-repeat-start
,ng-repeat-end
hancurkan desain saya, jadi solusinya adalah membuat variabel tambahan dengan menambahkan objek pemisah ini sebelum setiap elemen dan mengulangi var baru:<div class="c477_group"> <div class="c477_group_item" ng-repeat="item in itemsWithSeparator" ng-switch="item.id" ng-class="{'-divider' : item.id == 'SEPARATOR'}"> <div class="c478" ng-switch-when="FAS"/> <div class="c478" ng-switch-when="SEPARATOR" /> <div class="c479" ng-switch-default /> </div> </div>
Jawaban di atas benar tetapi untuk jawaban yang lebih umum tidak cukup. Saya perlu ng-ngulangi, tapi tetap pada level html yang sama, artinya tulis elemen-elemen di induk yang sama. Array tag berisi tag yang juga memiliki array tag. Sebenarnya itu adalah pohon.
Jadi inilah yang akhirnya saya lakukan.
Catat ng-if = "false" yang menyembunyikan div awal dan akhir.
Itu harus dicetak
name1, name1_1, name1_2, name2, name2_1, name2_2,
sumber
Saya hanya ingin berkomentar, tetapi reputasi saya masih kurang. Jadi saya menambahkan solusi lain yang memecahkan masalah juga. Saya benar-benar ingin menyangkal pernyataan yang dibuat oleh @bmoeskau bahwa penyelesaian masalah ini memerlukan solusi 'hacky at best', dan karena ini muncul baru-baru ini dalam diskusi meskipun posting ini berumur 2 tahun, saya ingin menambahkan memiliki dua sen:
Seperti @btford tunjukkan, Anda tampaknya mencoba mengubah struktur rekursif menjadi daftar, jadi Anda harus meratakan struktur itu menjadi daftar terlebih dahulu. Solusinya melakukan itu, tetapi ada pendapat yang menyebut fungsi di dalam templat tidak tepat. jika itu benar (jujur, saya tidak tahu) tidakkah itu hanya memerlukan menjalankan fungsi di controller daripada direktif?
Bagaimanapun, html Anda memerlukan daftar, sehingga ruang lingkup yang membuatnya harus memiliki daftar untuk bekerja dengannya. Anda hanya perlu meratakan struktur di dalam pengontrol Anda. setelah Anda memiliki array $ scope.rows, Anda dapat menghasilkan tabel dengan satu, ng-repeat sederhana. Tidak ada peretasan, tidak ada kekurangan, hanya cara itu dirancang untuk bekerja.
Arahan arahan tidak kurang fungsional. Mereka hanya memaksa Anda untuk menulis html yang valid. Seorang kolega saya memiliki masalah yang sama, mengutip @bmoeskau untuk mendukung kritik atas fitur templar / rendering yang dibuat oleh angulars. Ketika melihat masalah yang tepat, ternyata dia hanya ingin membuat tag terbuka, lalu menutup tag di tempat lain, dll. Sama seperti di masa lalu ketika kita akan menggabungkan html kita dari string .. benar? tidak.
untuk meratakan struktur menjadi daftar, inilah solusi lain:
ini akan berfungsi untuk struktur seperti pohon yang memiliki sub item. Jika Anda menginginkan keseluruhan item alih-alih properti, Anda dapat lebih mempersingkat fungsi perataan.
berharap itu bisa membantu.
sumber
untuk solusi yang benar-benar berfungsi
html
tambahkan direktif angular.js
untuk penjelasan singkat,
ng-repeat mengikat dirinya sendiri ke
<remove>
elemen dan loop sebagaimana mestinya, dan karena kami telah menggunakan ng-repeat-start / ng-repeat-end itu loop blok html bukan hanya elemen.lalu kustom menghapus arahan menempatkan elemen
<remove>
mulai dan selesai dengan<!--removed element-->
sumber
Saya pikir ini valid :)
sumber