Directiva AngularJS ng-repeat cu exemplu
⚡ Rezumat inteligent
Directiva ng-repeat din AngularJS redă o copie a unui element pentru fiecare element dintr-o colecție definită în domeniul de aplicare al controlerului. Transformă un array într-o listă, un tabel sau orice markup repetitiv fără a scrie o buclă manuală.

Directiva ng-repeat în AngularJS
ng-repetă directivă în AngularJS este folosit pentru a afișa valori repetitive definite în controller. Uneori trebuie să afișăm o listă de elemente în vizualizare, iar ng-repeat randează o listă definită în controller pe o pagină de vizualizare.
⚠️ Notificare de asistență: AngularJS a atins sfârșitul duratei de viață la 31 decembrie 2021 și nu primește alte corecții sau corecții de securitate. Directiva de mai jos rămâne corectă pentru menținerea aplicațiilor AngularJS 1.x existente; în versiunile moderne Unghiular echivalentul este *ngFor directivă structurală.
Exemplu de directivă AngularJS ng-repeat
Să luăm un exemplu de directivă ng-repeat în 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 Explicaţie:
- În controlor, definim mai întâi matricea de elemente ale listei care vor fi afișate în vizualizare. Aici, o matrice numită
TopicNamesconține trei elemente, fiecare o pereche nume-valoare. - Matricea este atribuită direct
$scope.TopicNames, ceea ce îl face disponibil pentru vizualizarea legată de acest controler. - Etichetele HTML
<ul>(listă neordonată) și<li>(element listă) afișează elementele. Directiva ng-repeat iterează peste fiecare intrare din matrice șitpnameeste variabila locală care conține elementul curent, deci{{tpname.name}}afișează proprietatea sa name.
⚠️ Corecție: Explicația inițială preciza că matricea a fost „adăugată la o variabilă membru numită topics„. Nu există o astfel de variabilă în cod — matricea este atribuită direct $scope.TopicNames, care este numele la care se referă vizualizarea. Introducerea unui al doilea nume aici este o cauză frecventă a unei liste goale.
Dacă codul este executat cu succes, următorul rezultat este afișat în browser.
Controlere multiple AngularJS
Anterior am văzut un singur controler în care o metodă gestiona atât adunarea, cât și subunitatea.tracțiune de numere. În schimb, puteți utiliza mai multe controlere pentru a separa logica mai clar. De exemplu, un controler poate opera asupra numerelor, în timp ce altul operează asupra șirurilor de caractere.
Să luăm în considerare un exemplu de definire a mai multor controllere într-o aplicație 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 Explicaţie:
- Sunt definiți doi controleri,
firstcontrollerșisecondcontrollerFiecare atașează o variabilă propriei variabile domeniu:pnamein primul,lnamein secunda. - În vizualizare, al doilea controler este imbricat în primul, iar expresia este
lnamedin domeniul de aplicare intern. Deoarece un controler imbricat moștenește de la părintele său,{{pname}}s-ar rezolva și aici — moștenirea se desfășoară în jos, niciodată în sus.
Dacă codul este executat cu succes, textul al doilea controlor este afisat.
Instrucțiuni de utilizare track de cu ng-repeat
Cea mai frecventă eroare ng-repeat este eroarea Duplicates in a repeater are not allowedSe pare că în momentul în care o colecție conține aceeași valoare de două ori, redarea listei se oprește complet.
Cauza este identitatea tracrege. AngularJS are nevoie de o cheie stabilă pentru fiecare element, astfel încât să poată reutiliza nodurile DOM în loc să le reconstruiască la fiecare digest. În mod implicit, folosește valoarea elementului în sine, astfel încât două valori identice se ciocnesc.
<!-- 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>
Alegerea între cele două forme contează mai mult decât pare la prima vedere. Tracking by $index rezolvă întotdeauna eroarea, deoarece o poziție este unică prin definiție, dar leagă fiecare nod DOM de un slot mai degrabă decât de o înregistrare. Reordonarea sau filtrarea colecției reutilizează apoi nodurile greșite, care apar ca și câmpuri de intrare keeping textul rândului anterior.
Tracking printr-un identificator autentic, cum ar fi topic.id evită complet acest lucru. AngularJS poate urmări fiecare înregistrare pe măsură ce se mișcă, astfel încât reordonează nodurile existente în loc să le distrugă și să le reconstruiască. Pe listele lungi, acest lucru este, de asemenea, semnificativ mai rapid, deoarece o re-randare atinge doar rândurile care s-au modificat efectiv. Folosește $index numai pentru tablouri de valori simple care nu se reordonează niciodată.
Proprietăți speciale disponibile în ng-repeat
Fiecare iterație a funcției ng-repeat expune mai multe proprietăți read-only în propriul domeniu de aplicare copil. Acestea descriu unde se află elementul curent în cadrul colecției, ceea ce acoperă numerotarea, stilurile alternative și separatoarele fără a adăuga nicio stare suplimentară controlerului.
| Proprietatea | Tip | Valoare |
|---|---|---|
$index |
Număr | Poziția elementului curent, începând de la 0 |
$first |
boolean | Adevărat doar pentru primul element |
$last |
boolean | Adevărat doar pentru ultimul element |
$middle |
boolean | Adevărat pentru fiecare element care nu este nici primul, nici ultimul |
$even |
boolean | Adevărat când $index este par |
$odd |
boolean | Adevărat când $index este impar |
O utilizare tipică le combină cu clasa ng pentru striații zebră.ping, ca în ng-class="{'row-alt': $odd}", sau cu ng-if pentru a reda un separator pe fiecare rând, cu excepția ultimului, scris ng-if="!$last"Afișarea unui număr de rând lizibil de către om este pur și simplu {{$index + 1}}, deoarece indicele are bază zero. Toate cele șase proprietăți sunt recalculate automat ori de câte ori colecția se modifică, deci nu trebuie recalculat nimic manual.
Erori frecvente ng-repeat și cum să le remediați
Majoritatea problemelor legate de ng-repeat provin din valori duplicate, din moștenirea domeniului de aplicare sau din faptul că directiva se află pe elementul greșit. Fiecare simptom de mai jos își numește cauza.
- Duplicatele într-un repetor nu sunt permise: colecția deține o valoare repetată. Adăugați
track by $index, sau mai bine,track byo proprietate unică. - Lista nu afișează nimic: Numele din vizualizare nu se potrivește cu proprietatea din domeniu. Afișează colecția cu
{{TopicNames}}pentru a confirma că a sosit. - Fiecare element se repetă, inclusiv învelișul: ng-repeat a fost plasat pe recipient și nu pe articol. Mutați-l în
<li>or<tr>. - Editarea unei intrări modifică rândul greșit: lista este tracde
$indexîn timp ce articolele se rearanjează. Track printr-un identificator stabil în schimb. - Modificările din interiorul buclei nu persistă: fiecare iterație are propriul domeniu de aplicare copil, așadar scrierea într-o primitivă creează o copie locală. Scrieți într-o proprietate a obiectului, cum ar fi
item.done.




