Saya menggunakan ng-repeat dengan kode saya, saya memiliki nomor 'n' dari kotak teks berdasarkan ng-repeat. Saya ingin menyelaraskan kotak teks dengan tiga kolom.
ini kode saya
<div class="control-group" ng-repeat="oneExt in configAddr.ext">
{{$index+1}}.
<input type="text" name="macAdr{{$index+1}}"
id="macAddress" ng-model="oneExt.newValue" value=""/>
</div>
Jawaban:
Pendekatan yang paling andal dan benar secara teknis adalah dengan mengubah data dalam pengontrol. Berikut adalah fungsi dan penggunaan potongan sederhana.
Maka tampilan Anda akan terlihat seperti ini:
Jika Anda memiliki masukan apa pun di dalam
ng-repeat
, Anda mungkin ingin melepas / bergabung kembali dengan array saat data diubah atau saat dikirimkan. Berikut tampilannya dalam a$watch
, sehingga data selalu tersedia dalam format asli yang digabungkan:Banyak orang lebih suka melakukannya dalam tampilan dengan filter. Ini dimungkinkan, tetapi sebaiknya hanya digunakan untuk tujuan tampilan! Jika Anda menambahkan masukan dalam tampilan yang difilter ini, ini akan menyebabkan masalah yang dapat diselesaikan, tetapi tidak cantik atau tidak dapat diandalkan .
Masalah dengan filter ini adalah ia mengembalikan larik bersarang baru setiap kali. Angular mengamati nilai balik dari filter. Pertama kali filter dijalankan, Angular mengetahui nilainya, lalu menjalankannya lagi untuk memastikan sudah selesai diubah. Jika kedua nilai sama, siklus diakhiri. Jika tidak, filter akan aktif berulang kali hingga sama, atau Angular menyadari digest loop tak terbatas sedang terjadi dan dimatikan. Karena array / objek bertingkat baru sebelumnya tidak dilacak oleh Angular, ia selalu melihat nilai yang dikembalikan berbeda dari sebelumnya. Untuk memperbaiki filter "tidak stabil" ini, Anda harus menggabungkan filter dalam sebuah
memoize
fungsi.lodash
memilikimemoize
fungsi dan versi lodash terbaru juga menyertakanchunk
fungsi, jadi kita dapat membuat filter ini dengan sangat mudahnpm
modul dan menyusun skrip denganbrowserify
atauwebpack
.Ingat: hanya tampilan! Saring di pengontrol jika Anda menggunakan input!
Pasang lodash:
Buat filter:
Dan inilah contoh dengan filter ini:
Pesan item secara vertikal
Mengenai kolom vertikal (daftar dari atas ke bawah) daripada horizontal (kiri ke kanan), implementasi yang tepat bergantung pada semantik yang diinginkan. Daftar yang terbagi secara tidak merata dapat didistribusikan dengan berbagai cara. Inilah salah satu caranya:
Namun, cara paling langsung dan sederhana untuk mendapatkan kolom adalah dengan menggunakan kolom CSS :
sumber
a b c
keduad e f
. Bisakah saya menampilkana b
di kolom pertamac d
di kolom kedua dane f
di kolom ketiga? Terima kasih[].concat.call([], val)
. Anda harus mempertimbangkan apaapply
.val
adalah larik larik, dan kami ingin meneruskan setiap larik di dalamnya sebagai argumenconcat
. Saya pikir Anda berfokus pada konteks[]
, yang bukan merupakan intinya di sini. Yang kami inginkan adalah[].concat(val[1], val[2], val[3], etc)
, jadi kami membutuhkanapply([], val)
[]
vs[[]]
dan[{}]
. Array / objek bersarang membuat Angular melihat hasil yang berbeda pada setiapfilter
, dan terus berulang mencari hasil agar tetap sama (stabilkan).var x = [1,2,3]; var y = [1,2,3]; console.log(x === y);
Pemeriksaan mendalam berarti merangkai dan membandingkan string, yang berisiko karena suatu objek mungkin tidak dapat dirangkai, atau secara rekursif memeriksa setiap properti secara individual. Saya pikir Angular dapat menerapkannya untuk filter, tetapi saya yakin ada alasan bagus mengapa mereka tidak melakukannya. Mungkin karena tujuan utamanya adalah filter untuk modifikasi sederhana kumpulan data, bukan perombakan total dengan perubahan struktur.Solusi ini sangat sederhana:
JSON:
HTML:
DEMO di FIDDLE
sumber
ng-switch-when="0"
div luar satu kali alih-alih 3 item.Solusi bersih dan mudah beradaptasi yang tidak memerlukan manipulasi data :
HTML:
CSS:
JavaScript:
Ini adalah solusi sederhana untuk merender data menjadi baris dan kolom secara dinamis tanpa perlu memanipulasi larik data yang Anda coba tampilkan. Ditambah jika Anda mencoba mengubah ukuran jendela browser Anda dapat melihat grid secara dinamis menyesuaikan dengan ukuran layar / div.
(Saya juga menambahkan akhiran {{$ index}} ke id Anda karena ng-repeat akan mencoba membuat beberapa elemen dengan id yang sama jika Anda tidak melakukannya.)
Contoh kerja serupa
sumber
<span ng-repeat="z in waiverModalLinks" ng-class="{'new-row':startNewRow($index, columnBreak)}" class="{{z.id}}"><a href="{{z.link}}{{z.title}}">{{z.title}}</a></span>
Itu ada di dalam 'modal-body'.Jawaban m59 cukup bagus. Satu hal yang saya tidak suka tentang itu adalah ia menggunakan
div
s untuk apa yang berpotensi menjadi data untuk tabel.Jadi sehubungan dengan filter m59 (jawaban di suatu tempat di atas), berikut adalah cara menampilkannya dalam tabel.
sumber
Berikut cara yang lebih sederhana:
Jawaban Cumulo Nimbus berguna bagi saya tetapi saya ingin grid ini dibungkus oleh div yang dapat menampilkan scrollbar ketika daftar terlalu panjang.
Untuk mencapai ini saya menambahkan
style="height:200px; overflow:auto"
ke div di sekitar tabel yang menyebabkannya ditampilkan sebagai satu kolom.Sekarang bekerja untuk panjang array satu.
sumber
ng-hide="$index%2!==0"
Saya memiliki fungsi dan menyimpannya dalam sebuah layanan sehingga saya dapat menggunakannya di seluruh aplikasi saya:
Layanan:
});
Pengontrol:
Markup:
sumber
Pendekatan saya adalah campuran dari beberapa hal.
Tujuan saya adalah memiliki kisi yang menyesuaikan dengan ukuran layar. Saya ingin 3 kolom untuk
lg
, 2 kolom untuksm
danmd
, dan 1 kolom untukxs
.Pertama, saya membuat fungsi cakupan berikut, menggunakan
$window
layanan sudut :Kemudian, saya menggunakan kelas yang diusulkan oleh @Cumulo Nimbus:
Di div yang berisi
ng-repeat
, saya menambahkanresizable
direktif, seperti yang dijelaskan di halaman ini , sehingga setiap kali jendela diubah ukurannya,$window
layanan sudut diperbarui dengan nilai baru.Akhirnya, dalam div berulang saya memiliki:
Tolong beri tahu saya jika ada kekurangan dalam pendekatan ini.
Semoga bisa bermanfaat.
sumber
Trik sederhana dengan CSS "clearfix" yang direkomendasikan oleh Bootstrap:
Banyak keuntungan: Efisien, cepat, menggunakan rekomendasi Boostrap, menghindari kemungkinan masalah $ digest, dan tidak mengubah model Angular.
sumber
Contoh ini menghasilkan repeater bersarang di mana data luar menyertakan array dalam yang ingin saya cantumkan dalam dua kolom. Konsep tersebut akan berlaku untuk tiga kolom atau lebih.
Di kolom dalam saya ulangi "baris" sampai batas tercapai. Batas ditentukan dengan membagi panjang larik item dengan jumlah kolom yang diinginkan, dalam hal ini dengan dua. Metode pembagian berada pada pengontrol dan melewatkan panjang array saat ini sebagai parameter. Fungsi JavaScript slice (0, array.length / columnCount) kemudian menerapkan batas ke pengulang.
Repeater kolom kedua kemudian dipanggil dan mengulangi slice (array.length / columnCount, array.length) yang menghasilkan paruh kedua array di kolom dua.
Semoga ini bisa membantu untuk melihat solusi dengan cara lain. (PS ini adalah posting pertama saya di sini! :-))
sumber
Saya perbaiki tanpa .row
dan css
sumber
Berikut cara yang mudah diretas untuk melakukannya. Ini lebih manual dan berakhir dengan markup yang berantakan. Saya tidak merekomendasikan ini, tetapi ada situasi di mana ini mungkin berguna.
Ini tautan biola http://jsfiddle.net/m0nk3y/9wcbpydq/
HTML:
JS:
Pengaturan ini mengharuskan kita untuk menggunakan beberapa Matematika pada markup: /, jadi Anda harus memasukkan Matematika dengan menambahkan baris ini:
$scope.Math = Math;
sumber
Semua jawaban ini tampaknya terlalu direkayasa.
Sejauh ini, metode paling sederhana adalah mengatur div input dalam bootstrap kolom col-md-4, kemudian bootstrap akan secara otomatis memformatnya menjadi 3 kolom karena sifat bootstrap 12 kolom:
sumber
sumber
Mendasarkan pada jawaban m59 yang sangat bagus. Saya menemukan bahwa input model akan kabur jika diubah, jadi Anda hanya dapat mengubah satu karakter dalam satu waktu. Ini adalah yang baru untuk daftar objek bagi siapa saja yang membutuhkannya:
Dan ini akan menjadi penggunaannya:
sumber
Saya baru dalam bootstrap dan angularjs, tapi ini juga bisa menjadikan Array per 4 item sebagai satu grup, hasilnya hampir seperti 3 kolom. Trik ini menggunakan prinsip garis putus bootstrap.
sumber
Lodash memiliki metode potongan bawaan sekarang yang secara pribadi saya gunakan: https://lodash.com/docs#chunk
Berdasarkan ini, kode pengontrol mungkin terlihat seperti berikut:
Lihat kode:
sumber
Cara lain diatur
width:33.33%; float:left
ke div pembungkus seperti ini:sumber
Saya menemukan diri saya dalam kasus serupa, ingin menghasilkan grup tampilan masing-masing 3 kolom. Namun, meskipun saya menggunakan bootstrap, saya mencoba memisahkan grup ini menjadi div induk yang berbeda. Saya juga ingin membuat sesuatu yang berguna secara umum.
Saya mendekatinya dengan 2
ng-repeat
seperti di bawah ini:Ini membuatnya sangat mudah untuk mengubah ke sejumlah kolom yang berbeda, dan dipisahkan menjadi beberapa div induk.
sumber
Untuk berjaga-jaga jika seseorang menginginkan Angular 7 (dan versi yang lebih tinggi), berikut adalah contoh yang saya gunakan di salah satu aplikasi saya:
HTML:
.TS FILE
Ini adalah solusi luar biasa untuk membuat kolom / baris baru secara dinamis tergantung pada berapa banyak item yang Anda iterasi dari database. Terima kasih!
sumber
ini menjawab pertanyaan awal yaitu bagaimana mendapatkan 1,2,3 di kolom. - Ditanyakan oleh kuppu 8 Feb '14 pukul 13:47
kode angularjs:
Lihat Kode (catatan: menggunakan bootstrap 3):
sumber
Kode ini akan membantu menyelaraskan elemen dengan tiga kolom dalam mode lg, dan md, dua kolom dalam mode sm, dan satu kolom adalah mode xs
sumber