AngularJS ng-repeat Direktiva s primjerom
โก Pametni saลพetak
Direktiva ng-repeat u AngularJS-u prikazuje jednu kopiju elementa za svaku stavku u kolekciji definiranoj na podruฤju kontrolera. Pretvara niz u listu, tablicu ili bilo koju ponavljajuฤu oznaku bez pisanja ruฤne petlje.

Direktiva ng-repeat u AngularJS
The ng-ponovi Direktiva U AngularJS-u se koristi za prikaz ponavljajuฤih vrijednosti definiranih u kontroleru. Ponekad trebamo prikazati popis stavki u pogledu, a ng-repeat prikazuje popis definiran u kontroleru na stranici pogleda.
โ ๏ธ Obavijest za podrลกku: AngularJS dosegnut kraj ลพivotnog vijeka 31. prosinca 2021. i ne prima daljnje zakrpe ili sigurnosne ispravke. Donja direktiva ostaje toฤna za odrลพavanje postojeฤih AngularJS 1.x aplikacija; u modernom Kutni ekvivalent je *ngFor strukturna direktiva.
Primjer AngularJS ng-repeat direktive
Pogledajmo primjer direktive ng-repeat u AngularJS-u:
<!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 Objaลกnjenje:
- u kontrolor, prvo definiramo niz stavki popisa koje ฤe se prikazivati โโu prikazu. Ovdje niz pod nazivom
TopicNamessadrลพi tri stavke, svaka par ime-vrijednost. - Niz je izravno dodijeljen
$scope.TopicNames, ลกto ga ฤini dostupnim pogledu vezanom za ovaj kontroler. - HTML oznake
<ul>(neureฤeni popis) i<li>(stavka popisa) prikazuje stavke. Direktiva ng-repeat iterira kroz svaki unos u nizu itpnameje lokalna varijabla koja sadrลพi trenutni element, dakle{{tpname.name}}ispisuje njegovo svojstvo imena.
โ ๏ธ Ispravak: Izvorno objaลกnjenje je navodilo da je niz โdodan ฤlanskoj varijabli pod nazivom topicsโ. Takva varijabla ne postoji u kodu โ niz je izravno dodijeljen $scope.TopicNames, ลกto je naziv na koji se prikaz odnosi. Uvoฤenje drugog naziva ovdje je ฤest uzrok praznog popisa.
Ako je kod uspjeลกno izvrลกen, u pregledniku se prikazuje sljedeฤi izlaz.
AngularJS viลกe kontrolera
Ranije smo vidjeli jedan kontroler u kojem je jedna metoda obraฤivala i zbrajanje i oduzimanjetraccija brojeva. Umjesto toga moลพete koristiti viลกe kontrolera za ฤiลกฤe odvajanje logike. Na primjer, jedan kontroler moลพe raditi s brojevima, dok drugi radi s nizovima znakova.
Pogledajmo primjer definiranja viลกe kontrolera u AngularJS aplikaciji.
<!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 Objaลกnjenje:
- Definirana su dva kontrolera,
firstcontrollerisecondcontrollerSvaki pridruลพuje varijablu svojoj vlastitoj djelokrug:pnameu prvom,lnameu drugom. - U prikazu, drugi kontroler je ugnijeลพฤen unutar prvog, a izraz glasi
lnameiz unutarnjeg opsega. Buduฤi da ugnijeลพฤeni kontroler nasljeฤuje od svog roditelja,{{pname}}bi se i ovdje rijeลกilo - nasljeฤivanje teฤe prema dolje, nikada prema gore.
Ako je kod uspjeลกno izvrลกen, tekst drugi kontroler .
Kako koristiti track by s ng-ponavljanjem
Najฤeลกฤi kvar ng-repeat je greลกka Duplicates in a repeater are not allowedPojavljuje se u trenutku kada kolekcija sadrลพi istu vrijednost dva puta i potpuno zaustavlja renderiranje liste.
Uzrok je identitet trackralj. AngularJS treba stabilan kljuฤ za svaku stavku kako bi mogao ponovno koristiti DOM ฤvorove umjesto da ih ponovno izgraฤuje pri svakom saลพetku. Prema zadanim postavkama koristi samu vrijednost stavke, pa se dvije identiฤne vrijednosti sudaraju.
<!-- 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>
Izbor izmeฤu dva oblika vaลพniji je nego ลกto se na prvi pogled ฤini. Tracking by $index uvijek rjeลกava greลกku, jer je pozicija jedinstvena po definiciji, ali svaki DOM ฤvor veลพe za utor, a ne za zapis. Promjena redoslijeda ili filtriranje kolekcije zatim ponovno koristi pogreลกne ฤvorove, ลกto se prikazuje kao polja za unos koja ostajuping tekst prethodnog retka.
Tracking putem pravog identifikatora kao ลกto je topic.id to u potpunosti izbjegava. AngularJS moลพe pratiti svaki zapis dok se pomiฤe, pa mijenja redoslijed postojeฤih ฤvorova umjesto da ih uniลกtava i ponovno gradi. Na dugim listama ovo je takoฤer znatno brลพe, jer ponovno renderiranje dotiฤe samo retke koji su se zapravo promijenili. Koristite $index samo za nizove obiฤnih vrijednosti koji se nikada ne preureฤuju.
Posebna svojstva dostupna unutar ng-repeat
Svaka iteracija ng-repeat otkriva nekoliko svojstava samo za ฤitanje na vlastitom podreฤenom opsegu. Ona opisuju gdje se trenutna stavka nalazi unutar kolekcije, ลกto pokriva numeriranje, izmjeniฤne stilove i separatore bez dodavanja ikakvog dodatnog stanja kontroleru.
| Svojstvo | Tip | Joลก malo brojeva |
|---|---|---|
$index |
Broj | Poloลพaj trenutne stavke, poฤevลกi od 0 |
$first |
Booleova | Vrijedi samo za prvu stavku |
$last |
Booleova | Vrijedi samo za posljednju stavku |
$middle |
Booleova | Istinito za svaku stavku koja nije ni prva ni zadnja |
$even |
Booleova | True kada je $index paran |
$odd |
Booleova | True kada je $index neparan |
Tipiฤna upotreba ih kombinira s ng-klasom za zebra strips.ping, kao u ng-class="{'row-alt': $odd}"ili s ng-if za prikaz razdjelnika u svakom retku osim zadnjeg, napisanog ng-if="!$last"Prikaz broja retka koji je ฤitljiv ljudima je jednostavno {{$index + 1}}, buduฤi da je indeks baziran na nuli. Svih ลกest svojstava automatski se ponovno izraฤunava kad god se kolekcija promijeni, tako da niลกta ne treba ruฤno ponovno izraฤunavati.
Uobiฤajene ng-repeat greลกke i kako ih ispraviti
Veฤina problema s ng-repeat dolazi od dupliciranih vrijednosti, nasljeฤivanja opsega ili od direktive koja se nalazi na pogreลกnom elementu. Svaki simptom u nastavku imenuje svoj uzrok.
- Duplikati u repetitoru nisu dopuลกteni: kolekcija sadrลพi ponovljenu vrijednost. Dodaj
track by $index, ili bolje,track byjedinstvena nekretnina. - Popis ne prikazuje niลกta: Naziv u prikazu ne odgovara svojstvu na opsegu. Ispiลกite kolekciju s
{{TopicNames}}kako bi se potvrdilo da je stiglo. - Svaki element se ponavlja, ukljuฤujuฤi i omotaฤ: ng-repeat je postavljen na kontejner, a ne na stavku. Premjestite ga u
<li>or<tr>. - Ureฤivanjem unosa mijenja se pogreลกan redak: popis je tracked by
$indexdok se artikli preureฤuju. Track umjesto toga stabilnim identifikatorom. - Promjene unutar petlje se ne zadrลพavaju: Svaka iteracija ima svoj vlastiti podreฤeni opseg, pa pisanje u primitiv stvara lokalnu kopiju. Pisanje u svojstvo objekta, kao ลกto je
item.done.




