Apakah ada cara untuk ng-repeat
menentukan berapa kali alih-alih selalu harus beralih ke array?
Sebagai contoh, di bawah ini saya ingin item daftar muncul 5 kali dengan asumsi $scope.number
sama dengan 5 selain menambah nomor sehingga setiap item daftar bertambah seperti 1, 2, 3, 4, 5
Hasil yang diinginkan:
<ul>
<li><span>1</span></li>
<li><span>2</span></li>
<li><span>3</span></li>
<li><span>4</span></li>
<li><span>5</span></li>
</ul>
javascript
html
angularjs
angularjs-ng-repeat
Malcr001
sumber
sumber
Jawaban:
Pembaruan (25/9/2018)
Versi AngularJS yang lebih baru (> = 1.3.0) memungkinkan Anda melakukan ini hanya dengan variabel (tidak diperlukan fungsi):
Ini tidak mungkin pada saat pertanyaan pertama kali diajukan. Penghargaan untuk @Nikhil Nambiar dari jawabannya di bawah untuk pembaruan ini
Asli (29/5/2013)
Saat ini,
ng-repeat
hanya menerima koleksi sebagai parameter, tetapi Anda bisa melakukan ini:Dan di suatu tempat di controller Anda:
Ini akan memungkinkan Anda untuk mengubah
$scope.number
ke nomor apa pun sesuka Anda dan tetap mempertahankan ikatan yang Anda cari.EDIT (1/6/2014) - Versi AngularJS yang lebih baru (> = 1.1.5) membutuhkan
track by $index
:Berikut adalah biola dengan beberapa daftar menggunakan
getNumber
fungsi yang sama .sumber
kamu bisa melakukan ini:
sumber
Berikut adalah contoh bagaimana Anda bisa melakukan ini. Perhatikan bahwa saya terinspirasi oleh komentar di dokumen ng-repeat: http://jsfiddle.net/digitalzebra/wnWY6/
Perhatikan arahan ng-repeat:
Ini controllernya:
sumber
_.range
dari Underscore atau lodash untuk membuat array: $ scope.range = _.range (0, n);Saya pikir jsFiddle ini dari utas ini mungkin apa yang Anda cari.
sumber
$scope.number
sama dengan 5". Maksudnya adalah untuk menggunakan variabel integer untuk menentukan jumlah item, bukan hardcode dan tidak menggunakan array yang telah ditentukan.$scope.limit = 2
) dan menggunakannya seperti...|limitTo:limit
- lihat biola diperbaruiPendekatan yang lebih sederhana adalah (misalnya 5 kali):
sumber
Array(5)
(atau memang[...Array(5).keys()]
untuk mendapatkan array [0,1,2,3,4])Saya mengalami masalah yang sama. Saya menemukan utas ini, tetapi tidak suka metode yang mereka miliki di sini. Solusi saya menggunakan underscore.js, yang sudah kami pasang. Sesederhana ini:
Ini akan melakukan apa yang Anda cari.
sumber
$scope._ = _
.$rootScope
sehingga dapat digunakan di mana-mana. Letakkan ini dalamapp.run
fungsi Anda tepat setelahapp.config
:app.run(function ($rootScope) { $rootScope._ = _; });
Saya ingin menjaga html saya sangat minimal, sehingga mendefinisikan filter kecil yang membuat array [0,1,2, ...] seperti yang dilakukan orang lain:
Setelah itu, pada tampilan dimungkinkan untuk digunakan seperti ini:
sumber
Ini benar-benar UGLY, tetapi ia bekerja tanpa pengontrol untuk integer atau variabel:
bilangan bulat:
variabel:
sumber
_ in (_ = []).length = 33; _ track by $index
sedikit lebih kecilAda banyak cara untuk melakukan ini. Saya benar-benar terganggu karena memiliki logika di controller saya jadi saya membuat arahan sederhana untuk menyelesaikan masalah pengulangan elemen n-kali.
Instalasi:
Arahan dapat diinstal menggunakan
bower install angular-repeat-n
Contoh:
menghasilkan:
1234
Ini juga berfungsi menggunakan variabel lingkup:
Sumber:
Github
sumber
Ini hanya sedikit variasi pada jawaban yang diterima, tetapi Anda tidak benar-benar perlu membuat fungsi baru . Hanya mengimpor 'Array' dalam cakupan:
Lihat biola ini untuk contoh langsung.
sumber
Jawaban termudah: 2 baris kode
JS (di pengontrol AngularJS Anda)
HTML
... di mana
repeatCount
jumlah pengulangan yang seharusnya muncul di lokasi ini.sumber
repeatCount
dengan angka aktual dalam HTML, dan selama nomor itu kurang dari atau sama denganMAX_REPEATS
, ini akan memungkinkan Anda mengatur nomor pengulangan dalam HTML.ngRepeat
arahan. MenggunakanArray.prototype.slice
dan JS idiomatik harus selalu dipilih di atas pustaka seperti underscore.js (tergantung pada kompatibilitas browser).angular memberikan fungsi yang sangat manis yang disebut slice .. menggunakan ini Anda dapat mencapai apa yang Anda cari. mis. ng-repeat = "ab in abc.slice (startIndex, endIndex)"
demo ini: http://jsfiddle.net/sahilosheal/LurcV/39/ akan membantu Anda dan memberi tahu Anda cara menggunakan fungsi "memudahkan hidup" ini. :)
html:
CSS:
ng-JS:
sumber
Inilah jawaban untuk 1.2.1 sudut
Pada dasarnya itu sama, dengan sedikit modifikasi dari
ng-repeat
di sini adalah biola: http://jsfiddle.net/cHQLH/153/
ini karena sudut 1.2 tidak memungkinkan nilai duplikat dalam arahan. Ini berarti jika Anda mencoba melakukan hal berikut, Anda akan mendapatkan kesalahan.
sumber
Anda dapat menggunakan
ng-if
arahan denganng-repeat
Jadi, jika num adalah berapa kali Anda perlu elemen diulang:
sumber
ng-repeat
cara ini masih akan menampilkan tag komentar itu (<!-- ngIf: $index < num -->
dll ..). Tidak akan adali
elemen untuk DOM render. Periksa "sumber tampilan" pada panel hasil di sini untuk melihat apa yang saya maksud.Anda dapat menggunakan contoh ini.
Pengontrol di dalam:
Contoh untuk elemen pilih di sisi kode HTML:
sumber
Untuk pengguna yang menggunakan CoffeeScript, Anda dapat menggunakan pemahaman rentang:
Pengarahan
atau Pengendali
Templat
sumber
Memperluas sedikit jawaban pertama Ivan sedikit, Anda dapat menggunakan string sebagai koleksi tanpa trek dengan pernyataan selama karakternya unik, jadi jika case-use kurang dari 10 angka seperti pertanyaan saya hanya akan melakukan :
Yang agak jenky, pasti, tapi cukup sederhana untuk dilihat dan tidak terlalu membingungkan.
sumber
Pertama, buat filter sudut menggunakan LoDash:
Fungsi kali LoDash mampu menangani angka null, tidak terdefinisi, 0, dan representasi string.
Kemudian, gunakan dalam HTML Anda karena ini:
atau
sumber
Saya membutuhkan solusi yang lebih dinamis untuk ini - di mana saya bisa menambah pengulangan.
HTML
Kontrol Duplikator
JS
sumber
Angular menyediakan filter untuk mengubah koleksi. Dalam hal ini koleksi akan menjadi nol, yaitu [], dan filter juga menggunakan argumen, sebagai berikut:
JS:
Metode ini sangat mirip dengan yang diusulkan di atas dan tidak selalu unggul tetapi menunjukkan kekuatan filter di AngularJS.
sumber
Jika n tidak terlalu tinggi, opsi lain bisa menggunakan split ('') dengan string n karakter:
sumber
Saya mengalami masalah yang sama dan inilah yang saya hasilkan:
... dan html:
CONTOH LANGSUNG
Saya menggunakan
times
fungsi garis bawah seperti yang telah kita gunakan pada proyek, tetapi Anda dapat dengan mudah menggantinya dengan kode asli.sumber
Saya membuat arahan yang dapat digunakan kembali di mana nomor maks akan berasal dari ng-repeat lain. Jadi, ini adalah edit dari jawaban dengan suara terbaik.
Ubah saja kode di controller untuk ini -
Ini akan mengembalikan array baru dengan jumlah iterasi yang ditentukan
sumber
karena iterasi pada string, itu akan membuat item untuk setiap karakter:
kita bisa menggunakan solusi jelek tapi tanpa kode ini menggunakan
number|n decimal places
filter asli.dengan cara ini kita akan memiliki
mynumber
elemen tanpa kode tambahan. Katakan'0.000'
.Kami menggunakan
mynumber - 2
untuk mengkompensasi0.
Ini tidak akan berfungsi untuk angka di bawah 3, tetapi mungkin berguna dalam beberapa kasus.
sumber
track by $index
?ng-repeat="i in [1,2,3,4]"
$scope.number
aaaa
adalah contoh untuk menjelaskan solusi saya yang tidak terlalu elegan. Menggunakan hardcoded 'aaaa' atau 'abcd' Anda mendapatkan daftar panjang tetap, tetapi menambahkanmynumber-2
desimal ke 0, Anda mendapatkan 'string' denganmynumber
karakter. Katakanlahmynumber=5
, Anda dapatkan'0.000'
, lalu kita beralih menggunakan $ indexsumber
cara sederhana:
dalam komponen / controller dan kemudian:
Kode ini dari proyek naskah saya tetapi bisa disusun ulang menjadi javascript murni
sumber