Petunjuk ng-repeat AngularJS dengan Contoh
⚡ Ringkasan Cerdas
Direktif ng-repeat di AngularJS merender satu salinan elemen untuk setiap item dalam koleksi yang didefinisikan pada cakupan controller. Ini mengubah array menjadi daftar, tabel, atau markup berulang lainnya tanpa menulis perulangan manual.

Petunjuk ng-repeat di AngularJS
The ng-ulangi Direktif Dalam AngularJS, `ng-repeat` digunakan untuk menampilkan nilai berulang yang didefinisikan dalam controller. Terkadang kita perlu menampilkan daftar item di view, dan `ng-repeat` akan merender daftar yang didefinisikan dalam controller ke halaman view.
⚠️ Pemberitahuan dukungan: AngularJS telah mencapai akhir hayat pada 31 Desember 2021 dan tidak menerima patch atau perbaikan keamanan lebih lanjut. Arahan di bawah ini tetap akurat untuk memelihara aplikasi AngularJS 1.x yang ada; dalam versi modern Kaku yang setara adalah *ngFor arahan struktural.
Contoh Petunjuk AngularJS ng-repeat
Mari kita lihat contoh directive ng-repeat di AngularJS:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Event Registration</title> </head> <body> <h1>Guru99 Global Event</h1> <script src="https://code.angularjs.org/1.8.3/angular.js"></script> <div ng-app="DemoApp" ng-controller="DemoController"> <h1>Topics</h1> <ul> <li ng-repeat="tpname in TopicNames"> {{tpname.name}} </li> </ul> </div> <script> var app = angular.module('DemoApp', []); app.controller('DemoController', function($scope) { $scope.TopicNames = [ { name: "What controllers do from Angular's perspective" }, { name: "Controller Methods" }, { name: "Building a basic controller" } ]; }); </script> </body> </html>
Code Penjelasan:
- Dalam majalah pengawasPertama-tama, kita mendefinisikan array item daftar yang akan ditampilkan di tampilan. Di sini, sebuah array disebut
TopicNamesberisi tiga item, masing-masing berupa pasangan nama-nilai. - Array tersebut langsung diberikan ke
$scope.TopicNames, yang membuatnya tersedia untuk tampilan yang terikat pada pengontrol ini. - Tag HTML
<ul>(daftar tidak berurutan) dan<li>(item daftar) menampilkan item. Direktif ng-repeat mengulangi setiap entri dalam array, dantpnameadalah variabel lokal yang menyimpan item saat ini, jadi{{tpname.name}}mencetak properti namanya.
⚠️ Koreksi: Penjelasan aslinya menyatakan bahwa array tersebut "ditambahkan ke variabel anggota yang disebut topics“. Variabel seperti itu tidak ada dalam kode — array langsung diberikan ke $scope.TopicNames, yang merupakan nama yang dirujuk oleh tampilan tersebut. Memperkenalkan nama kedua di sini adalah penyebab umum dari daftar kosong.
Jika kode berhasil dieksekusi, output berikut akan ditampilkan di browser.
Pengontrol Berganda AngularJS
Sebelumnya kita melihat sebuah controller tunggal di mana satu metode menangani baik penjumlahan maupun pengurangan.tracalih-alih menangani angka, Anda dapat menggunakan beberapa controller untuk memisahkan logika dengan lebih rapi. Misalnya, satu controller dapat beroperasi pada angka sementara controller lain beroperasi pada string.
Mari kita lihat contoh mendefinisikan beberapa controller dalam aplikasi AngularJS.
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Event Registration</title> </head> <body> <h1>Guru99 Global Event</h1> <script src="https://code.angularjs.org/1.8.3/angular.js"></script> <div ng-app="DemoApp"> <div ng-controller="firstcontroller"> <div ng-controller="secondcontroller"> {{lname}} </div> </div> </div> <script> var app = angular.module('DemoApp', []); app.controller('firstcontroller', function($scope) { $scope.pname = "firstcontroller"; }); app.controller('secondcontroller', function($scope) { $scope.lname = "secondcontroller"; }); </script> </body> </html>
Code Penjelasan:
- Dua pengontrol didefinisikan,
firstcontrollerkesecondcontrollerMasing-masing melampirkan variabel ke variabelnya sendiri. cakupan:pnamepada yang pertama,lnamedi kedua. - Dalam tampilan tersebut, controller kedua bersarang di dalam controller pertama, dan ekspresinya berbunyi
lnamedari cakupan dalam. Karena pengontrol bersarang mewarisi dari induknya,{{pname}}Hal ini juga akan terselesaikan di sini — pewarisan mengalir ke bawah, tidak pernah ke atas.
Jika kode berhasil dieksekusi, teks pengontrol kedua ditampilkan.
Cara Menggunakan track oleh dengan ng-repeat
Kegagalan ng-repeat yang paling umum adalah kesalahan ini. Duplicates in a repeater are not allowed. Ini muncul saat sebuah koleksi berisi nilai yang sama dua kali, dan menghentikan rendering daftar sepenuhnya.
Penyebabnya adalah identitas. tracAngularJS membutuhkan kunci yang stabil untuk setiap item agar dapat menggunakan kembali node DOM daripada membangunnya kembali setiap kali terjadi digest. Secara default, AngularJS menggunakan nilai item itu sendiri, sehingga dua nilai yang identik akan bertabrakan.
<!-- Fails: the value 2 appears twice --> <li ng-repeat="n in [1, 2, 2, 3]">{{n}}</li> <!-- Works: position is unique even when values repeat --> <li ng-repeat="n in [1, 2, 2, 3] track by $index">{{n}}</li> <!-- Best for records from a server: track by a real identifier --> <li ng-repeat="topic in TopicNames track by topic.id">{{topic.name}}</li>
Memilih di antara kedua bentuk tersebut ternyata lebih penting daripada yang terlihat pada awalnya. Tracking by $index selalu menyelesaikan kesalahan, karena posisi bersifat unik menurut definisi, tetapi ia mengikat setiap node DOM ke slot daripada ke record. Mengurutkan ulang atau memfilter koleksi kemudian menggunakan kembali node yang salah, yang muncul sebagai kolom input yang terus muncul.ping teks baris sebelumnya.
Tracking dengan pengenal yang sah seperti topic.id Hal itu sepenuhnya menghindari masalah tersebut. AngularJS dapat mengikuti setiap data saat berpindah, sehingga ia menyusun ulang node yang ada alih-alih menghancurkan dan membangunnya kembali. Pada daftar yang panjang, ini juga jauh lebih cepat, karena rendering ulang hanya menyentuh baris yang benar-benar berubah. Gunakan $index hanya untuk larik nilai biasa yang tidak pernah diurutkan ulang.
Properti Khusus yang Tersedia di Dalam ng-repeat
Setiap iterasi ng-repeat mengekspos beberapa properti hanya baca pada cakupan anak-nya sendiri. Properti ini menjelaskan posisi item saat ini dalam koleksi, yang mencakup penomoran, gaya bergantian, dan pemisah tanpa menambahkan status tambahan apa pun ke controller.
| Milik | Tipe | Nilai |
|---|---|---|
$index |
Jumlah | Posisi item saat ini, dimulai dari 0 |
$first |
Boolean | Hanya berlaku untuk item pertama saja |
$last |
Boolean | Hanya berlaku untuk item terakhir. |
$middle |
Boolean | Hal ini berlaku untuk setiap item yang bukan pertama maupun terakhir. |
$even |
Boolean | Benar jika $indeks genap |
$odd |
Boolean | Benar jika $index adalah bilangan ganjil |
Penggunaan umum menggabungkannya dengan ng-class untuk zebra striping, seperti dalam ng-class="{'row-alt': $odd}", atau dengan ng-if untuk menampilkan pemisah di setiap baris kecuali baris terakhir, tertulis ng-if="!$last"Menampilkan nomor baris yang mudah dibaca manusia itu sangat sederhana. {{$index + 1}}, karena indeksnya berbasis nol. Keenam properti tersebut dihitung ulang secara otomatis setiap kali koleksi berubah, sehingga tidak ada yang perlu dihitung ulang secara manual.
Kesalahan Umum ng-repeat dan Cara Memperbaikinya
Sebagian besar masalah ng-repeat berasal dari nilai duplikat, pewarisan cakupan, atau dari direktif yang berada pada elemen yang salah. Setiap gejala di bawah ini menyebutkan penyebabnya.
- Duplikat dalam repeater tidak diperbolehkan: Koleksi tersebut berisi nilai yang berulang. Tambahkan
track by $index, atau lebih baik,track byproperti yang unik. - Daftar tersebut tidak menampilkan apa pun: Nama pada tampilan tidak sesuai dengan properti pada cakupan. Cetak koleksi dengan
{{TopicNames}}untuk memastikan barang tersebut telah sampai. - Setiap elemen diulang, termasuk pembungkusnya: ng-repeat ditempatkan pada container, bukan pada item. Pindahkan ke
<li>or<tr>. - Mengedit input akan mengubah baris yang salah: daftarnya adalah tracdiketik oleh
$indexsementara barang-barang dipesan ulang. Track digantikan oleh pengidentifikasi yang stabil. - Perubahan di dalam loop tidak akan tersimpan: Setiap iterasi memiliki cakupan anak (child scope) sendiri, sehingga menulis ke tipe data primitif akan membuat salinan lokal. Tulis ke properti objek, seperti...
item.done.




