AngularJS ng-repeat-Direktive mit Beispiel
โก Intelligente Zusammenfassung
Die ng-repeat-Direktive in AngularJS rendert fรผr jedes Element einer im Controller-Scope definierten Sammlung eine Kopie des jeweiligen Elements. Sie wandelt ein Array in eine Liste, eine Tabelle oder beliebiges sich wiederholendes Markup um, ohne dass eine manuelle Schleife erforderlich ist.

ng-repeat-Direktive in AngularJS
Das ng-Wiederholung Richtlinien In AngularJS wird `ng-repeat` verwendet, um im Controller definierte, sich wiederholende Werte anzuzeigen. Manchmal ist es notwendig, eine Liste von Elementen in der Ansicht darzustellen, und `ng-repeat` rendert eine im Controller definierte Liste auf einer Ansichtsseite.
โ ๏ธ Supporthinweis: AngularJS hat erreicht Lebensende am 31. Dezember 2021 und erhรคlt keine weiteren Patches oder Sicherheitskorrekturen. Die folgende Anweisung bleibt fรผr die Wartung bestehender AngularJS 1.x-Anwendungen gรผltig; in modernen Angular Das รquivalent ist das *ngFor Strukturrichtlinie.
Beispiel fรผr eine AngularJS-Anweisung โng-repeatโ.
Betrachten wir ein Beispiel fรผr die ng-repeat-Direktive in 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 Erlรคuterung:
- Im ControllerZuerst definieren wir das Array der Listenelemente, die in der Ansicht angezeigt werden sollen. Hier ein Array namens
TopicNamesenthรคlt drei Elemente, jedes ein Name-Wert-Paar. - Das Array wird direkt zugewiesen an
$scope.TopicNamesDadurch steht es der an diesen Controller gebundenen Ansicht zur Verfรผgung. - Die HTML-Tags
<ul>(ungeordnete Liste) und<li>(Listenelement) Die Elemente werden angezeigt. Die ng-repeat-Direktive durchlรคuft jeden Eintrag im Array, undtpnameist die lokale Variable, die das aktuelle Element enthรคlt, also{{tpname.name}}Gibt seine Namenseigenschaft aus.
โ ๏ธ Korrektur: Die ursprรผngliche Erklรคrung besagte, dass das Array โeiner Member-Variablen namens hinzugefรผgt wurdeโ. topicsโEine solche Variable existiert im Code nicht โ das Array wird direkt zugewiesen.โ $scope.TopicNames, was der Name ist, auf den sich die Ansicht bezieht. Das Einfรผgen eines zweiten Namens an dieser Stelle ist eine hรคufige Ursache fรผr eine leere Liste.
Wenn der Code erfolgreich ausgefรผhrt wird, wird die folgende Ausgabe im Browser angezeigt.
AngularJS Mehrere Controller
Zuvor haben wir einen einzelnen Controller gesehen, in dem eine Methode sowohl Addition als auch Subtraktion verarbeitete.tracAnstatt Zahlen zu verarbeiten, kรถnnen Sie mehrere Controller verwenden, um die Logik sauberer zu trennen. Beispielsweise kann ein Controller Zahlen verarbeiten, wรคhrend ein anderer Zeichenketten verarbeitet.
Betrachten wir ein Beispiel fรผr die Definition mehrerer Controller in einer AngularJS-Anwendung.
<!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 Erlรคuterung:
- Es werden zwei Regler definiert.
firstcontrollerundsecondcontrollerJedes dieser Elemente ordnet seiner eigenen Variable eine Variable zu. kann:pnameim erstenlnamein dieser Sekunde. - In der Ansicht ist der zweite Controller im ersten verschachtelt, und der Ausdruck lautet:
lnameaus dem inneren Gรผltigkeitsbereich. Da ein verschachtelter Controller von seinem รผbergeordneten Controller erbt,{{pname}}wรผrde sich auch hier lรถsen โ die Vererbung flieรt nach unten, niemals nach oben.
Wenn der Code erfolgreich ausgefรผhrt wird, wird der Text angezeigt zweiter Controller wird angezeigt.
Anleitung von track by with ng-repeat
Der hรคufigste Fehler bei ng-repeat ist der Fehler Duplicates in a repeater are not allowedEs tritt auf, sobald eine Sammlung denselben Wert zweimal enthรคlt, und fรผhrt dazu, dass die Listendarstellung vollstรคndig gestoppt wird.
Die Ursache ist Identitรคt tracAngularJS benรถtigt fรผr jedes Element einen stabilen Schlรผssel, um DOM-Knoten wiederzuverwenden, anstatt sie bei jedem Digest neu zu erstellen. Standardmรครig wird der Elementwert selbst verwendet, was zu Konflikten zwischen zwei identischen Werten fรผhrt.
<!-- 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> <!-- besten for records from a server: track by a real identifier --> <li ng-repeat="topic in TopicNames track by topic.id">{{topic.name}}</li>
Die Wahl zwischen den beiden Formen ist wichtiger, als es zunรคchst scheint. Tracking by $index Das Problem wird zwar immer behoben, da eine Position per Definition eindeutig ist, aber es bindet jeden DOM-Knoten an einen Slot anstatt an einen Datensatz. Das Neuanordnen oder Filtern der Sammlung fรผhrt dann zur Wiederverwendung der falschen Knoten, was sich in fehlerhaften Eingabefeldern bemerkbar macht.ping Der Text der vorherigen Zeile.
Tracking durch einen gรผltigen Identifikator wie z.B. topic.id Das wird dadurch vollstรคndig vermieden. AngularJS kann jedem Datensatz folgen, wรคhrend er sich bewegt, und ordnet daher bestehende Knoten neu an, anstatt sie zu zerstรถren und neu zu erstellen. Bei langen Listen ist dies auch deutlich schneller, da beim erneuten Rendern nur die tatsรคchlich geรคnderten Zeilen betroffen sind. $index nur fรผr Arrays von einfachen Werten, die niemals neu angeordnet werden.
Spezielle Eigenschaften innerhalb von ng-repeat verfรผgbar
Jede Iteration von ng-repeat stellt mehrere schreibgeschรผtzte Eigenschaften in ihrem eigenen Kindbereich bereit. Diese beschreiben die Position des aktuellen Elements innerhalb der Sammlung und umfassen Nummerierung, abwechselnde Stile und Trennzeichen, ohne dem Controller zusรคtzlichen Zustand hinzuzufรผgen.
| Eigenschaft | Typ | Wert |
|---|---|---|
$index |
Nummer | Position des aktuellen Elements, beginnend bei 0 |
$first |
Boolean | Trifft nur auf den ersten Punkt zu |
$last |
Boolean | Trifft nur auf den letzten Punkt zu |
$middle |
Boolean | Gilt fรผr jedes Element, das weder das erste noch das letzte ist. |
$even |
Boolean | Trifft zu, wenn $index gerade ist |
$odd |
Boolean | Wahr, wenn $index ungerade ist. |
Eine typische Anwendung kombiniert sie mit ng-class fรผr Zebra-Strings.ping, Wie in ng-class="{'row-alt': $odd}"oder mit ng-if, um in jeder Zeile auรer der letzten ein Trennzeichen einzufรผgen, geschrieben ng-if="!$last"Die Anzeige einer fรผr Menschen lesbaren Zeilennummer ist einfach {{$index + 1}}Da der Index nullbasiert ist, werden alle sechs Eigenschaften automatisch neu berechnet, sobald sich die Sammlung รคndert; eine manuelle Neuberechnung ist daher nicht erforderlich.
Hรคufige ng-repeat-Fehler und wie man sie behebt
Die meisten Probleme mit ng-repeat entstehen durch doppelte Werte, durch Vererbung des Gรผltigkeitsbereichs oder dadurch, dass die Direktive auf dem falschen Element steht. Jedes der folgenden Symptome benennt seine Ursache.
- Doppelte Eintrรคge in einem Repeater sind nicht zulรคssig: Die Sammlung enthรคlt einen wiederholten Wert. Hinzufรผgen
track by $indexoder besser noch,track byein einzigartiges Anwesen. - Die Liste liefert kein Ergebnis: Der Name in der Ansicht stimmt nicht mit der Eigenschaft im Gรผltigkeitsbereich รผberein. Geben Sie die Auflistung aus mit
{{TopicNames}}um zu bestรคtigen, dass es angekommen ist. - Jedes Element wird wiederholt, einschlieรlich des Wrappers: ng-repeat wurde auf dem Container anstatt auf dem Element platziert. Verschieben Sie es dorthin.
<li>or<tr>. - Beim Bearbeiten einer Eingabe wird die falsche Zeile geรคndert: Die Liste ist tracgeked von
$indexwรคhrend Artikel neu bestellt werden. Track durch einen stabilen Bezeichner stattdessen. - รnderungen innerhalb der Schleife bleiben nicht erhalten: Jede Iteration hat ihren eigenen Kindbereich, daher erzeugt das Schreiben in einen primitiven Datentyp eine lokale Kopie. Schreiben Sie in eine Objekteigenschaft, wie zum Beispiel
item.done.




