AngularJS ng-repeat direktíva példával
⚡ Okos összefoglaló
Az AngularJS ng-repeat direktívája egy elem egy másolatát rendereli a vezérlő hatókörében definiált gyűjtemény minden eleméhez. Egy tömböt listává, táblázattá vagy bármilyen ismétlődő jelölőné alakít manuális ciklus írása nélkül.

ng-repeat direktíva az AngularJS-ben
Az ng-ismétlés Irányelv Az AngularJS-ben az függvényt a vezérlőben definiált ismétlődő értékek megjelenítésére használjuk. Néha szükségünk van egy elemlistára a nézetben, ilyenkor az ng-repeat egy, a vezérlőben definiált listát jelenít meg egy nézet oldalon.
⚠️ Támogatási közlemény: AngularJS elérve élettartam vége 2021. december 31-én és nem kap további javításokat vagy biztonsági javításokat. Az alábbi direktíva továbbra is pontos a meglévő AngularJS 1.x alkalmazások karbantartása érdekében; a modern szögletes az egyenértékű a *ngFor strukturális irányelv.
AngularJS ng-repeat direktíva Példa
Nézzünk egy példát az ng-repeat direktívára az AngularJS-ben:
<!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 Magyarázat:
- A ellenőr, először definiáljuk a nézetben megjelenítendő listaelemek tömbjét. Itt egy tömb, az úgynevezett
TopicNameshárom elemet tartalmaz, mindegyik egy név-érték párt. - A tömb közvetlenül hozzá van rendelve a következőhöz:
$scope.TopicNames, ami elérhetővé teszi azt a vezérlőhöz kötött nézet számára. - A HTML-címkék
<ul>(rendezetlen lista) és<li>(listaelem) megjeleníti az elemeket. Az ng-repeat direktíva végigmegy a tömb minden egyes elemén, éstpnameaz aktuális elemet tároló lokális változó, tehát{{tpname.name}}kinyomtatja a name tulajdonságát.
⚠️ Javítás: az eredeti magyarázat szerint a tömböt „hozzáadták egy tagváltozóhoz, amelynek neve topics„. A kódban nincs ilyen változó — a tömböt közvetlenül a következőhöz rendeljük hozzá: $scope.TopicNames, ami a nézet által hivatkozott név. Egy második név megadása itt az üres lista gyakori oka.
Ha a kód sikeresen végrehajtódik, a következő kimenet jelenik meg a böngészőben.
AngularJS több vezérlő
Korábban egyetlen vezérlőt láttunk, amelyben egy metódus kezelte az összeadást és a részhalmazt is.tracszámok szétválasztása. Ehelyett több vezérlőt is használhat a logika tisztább szétválasztásához. Például az egyik vezérlő számokkal, míg a másik karakterláncokkal működhet.
Nézzünk egy példát több vezérlő definiálására egy AngularJS alkalmazásban.
<!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 Magyarázat:
- Két vezérlő van definiálva,
firstcontrollerés asecondcontrollerMindegyik egy változót csatol a sajátjához. hatálya:pnameaz elsőben,lnamea másodikban. - A nézetben a második vezérlő az elsőbe van beágyazva, és a kifejezés a következőképpen néz ki:
lnamea belső hatókörből. Mivel egy beágyazott vezérlő örököl a szülőjétől,{{pname}}itt is feloldódna – az örökség lefelé áramlik, soha nem felfelé.
Ha a kód sikeresen végrehajtódik, a szöveg második vezérlő üzenet jelenik meg.
Hogyan használjuk track által ng-ismétléssel
Az ng-ismétlés leggyakoribb hibája a hiba Duplicates in a repeater are not allowedAbban a pillanatban jelenik meg, amikor egy gyűjtemény kétszer tartalmazza ugyanazt az értéket, és teljesen leállítja a lista megjelenítését.
Az ok az identitás trackirály. Az AngularJS-nek minden elemhez stabil kulcsra van szüksége, hogy újra felhasználhassa a DOM csomópontokat ahelyett, hogy minden kivonatoláskor újraépítené azokat. Alapértelmezés szerint magát az elem értékét használja, így két azonos érték ütközik.
<!-- 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>
A két forma közötti választás fontosabb, mint amilyennek elsőre látszik. Tracking by $index mindig megoldja a hibát, mivel egy pozíció definíció szerint egyedi, de minden DOM csomópontot egy slothoz, nem pedig egy rekordhoz köt. A gyűjtemény átrendezése vagy szűrése ezután újra felhasználja a rossz csomópontokat, amelyek bemeneti mezőként jelennek meg.ping az előző sor szövege.
Tracking egy valódi azonosító alapján, például topic.id Ezt teljesen elkerüli. Az AngularJS képes követni az egyes rekordok mozgását, így a meglévő csomópontokat átrendezi ahelyett, hogy megsemmisítené és újraépítené azokat. Hosszú listák esetén ez jelentősen gyorsabb is, mivel az újrarenderelés csak azokat a sorokat érinti, amelyek ténylegesen megváltoztak. $index csak sima értékekből álló tömbök esetén, amelyek soha nem rendeződnek át.
Az ng-repeat függvényen belül elérhető speciális tulajdonságok
Az ng-repeat minden egyes iterációja számos írásvédett tulajdonságot tesz elérhetővé a saját gyermek hatókörében. Ezek leírják, hogy az aktuális elem hol helyezkedik el a gyűjteményen belül, ami magában foglalja a számozást, a váltakozó stílusokat és az elválasztókat anélkül, hogy bármilyen extra állapotot hozzáadna a vezérlőhöz.
| Ingatlanok | típus | Érték: |
|---|---|---|
$index |
Szám | Az aktuális elem pozíciója, 0-tól kezdve |
$first |
logikai | Csak az első elemre igaz |
$last |
logikai | Csak az utolsó elemre igaz |
$middle |
logikai | Minden olyan elemre igaz, ami se nem első, se nem utolsó. |
$even |
logikai | Igaz, ha a $index páros szám. |
$odd |
logikai | Igaz, ha a $index páratlan. |
Egy tipikus felhasználási mód az ng-osztály zebra stri eseténping, mint a ng-class="{'row-alt': $odd}", vagy az ng-if függvénnyel, hogy minden sorban elválasztójel jelenjen meg, kivéve az utolsót, írva ng-if="!$last"Az ember által olvasható sorszám megjelenítése egyszerűen {{$index + 1}}, mivel az index nulla alapú. Mind a hat tulajdonság automatikusan újraszámításra kerül, amikor a gyűjtemény megváltozik, így semmit sem kell kézzel újraszámítani.
Gyakori ng-repeat hibák és javításuk
A legtöbb ng-ismétléses probléma duplikált értékekből, hatókör-öröklésből vagy a rossz elemen lévő direktívából ered. Az alábbi tünetek mindegyike megnevezi az okát.
- Az ismétlőben lévő ismétlődések nem engedélyezettek: a gyűjtemény ismétlődő értéket tartalmaz. Adj hozzá
track by $index, vagy még jobb,track byegyedi tulajdonság. - A lista semmit sem mutat: A nézetben szereplő név nem egyezik meg a hatókör tulajdonságával. Nyomtassa ki a gyűjteményt a következővel:
{{TopicNames}}hogy megerősítse megérkezését. - Minden elem ismétlődik, beleértve a wrappert is: Az ng-repeat a tárolóra lett helyezve, nem pedig az elemre. Helyezze át a következőre:
<li>or<tr>. - Egy bemenet szerkesztése a rossz sort módosítja: a lista tracáltal
$indexmiközben az elemek átrendeződnek. Track helyett egy stabil azonosítót használ. - A cikluson belüli változások nem maradnak meg: minden iterációnak saját gyermek hatóköre van, így egy primitívbe írás lokális másolatot hoz létre. Írás egy objektumtulajdonságba, például
item.done.




