Direktiva AngularJS ng-repeat s příkladem
⚡ Chytré shrnutí
Direktiva ng-repeat v AngularJS vykreslí jednu kopii elementu pro každou položku v kolekci definované v rozsahu kontroleru. Promění pole v seznam, tabulku nebo jakýkoli opakující se kód bez nutnosti ručního psaní smyčky.

ng-repeat směrnice v AngularJS
Jedno ng-opakovat Směrnice V AngularJS se používá k zobrazení opakujících se hodnot definovaných v kontroleru. Někdy potřebujeme zobrazit seznam položek v zobrazení a ng-repeat vykreslí seznam definovaný v kontroleru na stránku zobrazení.
⚠️ Oznámení podpory: AngularJS dosaženo konec životnosti k 31. prosinci 2021 a neobdrží žádné další záplaty ani bezpečnostní opravy. Níže uvedená směrnice zůstává platná pro údržbu stávajících aplikací AngularJS 1.x; v moderních ANGULAR ekvivalent je *ngFor strukturální směrnice.
Příklad směrnice AngularJS ng-repeat
Podívejme se na příklad direktivy ng-repeat v 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 Vysvětlení:
- v kontrolor, nejprve definujeme pole položek seznamu, které se mají zobrazit v pohledu. Zde pole s názvem
TopicNamesobsahuje tři položky, každou z nich jako pár název-hodnota. - Pole je přiřazeno přímo k
$scope.TopicNames, což jej zpřístupní pohledu vázanému na tento kontroleru. - HTML tagy
<ul>(neuspořádaný seznam) a<li>(položka seznamu) zobrazí položky. Direktiva ng-repeat iteruje přes každou položku v poli atpnameje lokální proměnná obsahující aktuální položku, takže{{tpname.name}}vypíše jeho vlastnost name.
⚠️ Oprava: Původní vysvětlení uvádělo, že pole bylo „přidáno k členské proměnné s názvem topics„. V kódu žádná taková proměnná neexistuje – pole je přiřazeno přímo k $scope.TopicNames, což je název, na který se pohled odkazuje. Zavedení druhého názvu je častou příčinou prázdného seznamu.
Pokud je kód úspěšně spuštěn, zobrazí se v prohlížeči následující výstup.
Vícenásobné ovladače AngularJS
Dříve jsme viděli jeden kontroler, ve kterém jedna metoda zpracovávala sčítání i odčítání.tracrozdělení čísel. Místo toho můžete použít více kontrolérů pro čistší oddělení logiky. Například jeden kontrolér může pracovat s čísly, zatímco jiný s řetězci.
Podívejme se na příklad definování více kontrolerů v aplikaci 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 Vysvětlení:
- Jsou definovány dva řadiče,
firstcontrollerasecondcontrollerKaždý připojuje proměnnou ke své vlastní rozsah:pnamev prvním,lnameve druhém. - V pohledu je druhý kontroler vnořený uvnitř prvního a výraz zní
lnamez vnitřního rozsahu. Protože vnořený kontroler dědí od svého rodiče,{{pname}}by se zde také vyřešilo – dědičnost plyne směrem dolů, nikdy směrem nahoru.
Pokud je kód úspěšně spuštěn, text druhý řídicí jednotka je zobrazen.
Jak používat track pomocí ng-opakování
Nejčastějším selháním ng-repeat je chyba Duplicates in a repeater are not allowedObjeví se v okamžiku, kdy kolekce obsahuje dvakrát stejnou hodnotu, a zcela zastaví vykreslování seznamu.
Příčinou je identita trackrál. AngularJS potřebuje pro každou položku stabilní klíč, aby mohl znovu používat uzly DOM, a ne je znovu sestavovat při každém digestování. Ve výchozím nastavení používá samotnou hodnotu položky, takže se dvě identické hodnoty kolidují.
<!-- 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>
Výběr mezi těmito dvěma formami je důležitější, než se na první pohled zdá. Tracking by $index vždy vyřeší chybu, protože pozice je ze své podstaty jedinečná, ale každý uzel DOM je vázán na slot, nikoli na záznam. Změna pořadí nebo filtrování kolekce pak znovu použije nesprávné uzly, které se zobrazí jako vstupní pole keeping text předchozího řádku.
Tracking skutečným identifikátorem, jako například topic.id Tomu se zcela vyhne. AngularJS dokáže sledovat každý záznam při jeho pohybu, takže mění pořadí existujících uzlů, místo aby je ničil a znovu sestavoval. U dlouhých seznamů je to také výrazně rychlejší, protože opětovné vykreslení se dotkne pouze řádků, které se skutečně změnily. Použijte $index pouze pro pole prostých hodnot, která se nikdy neuspořádají.
Speciální vlastnosti dostupné uvnitř ng-repeat
Každá iterace ng-repeat zpřístupňuje několik vlastností pouze pro čtení ve svém vlastním podřízeném oboru. Ty popisují, kde se aktuální položka v kolekci nachází, což zahrnuje číslování, střídání stylů a oddělovače, aniž by se do kontroleru přidával jakýkoli další stav.
| Vlastnictví | Typ | Hodnota |
|---|---|---|
$index |
Číslo | Pozice aktuální položky, počínaje od 0 |
$first |
Boolean | Platí pouze pro první položku |
$last |
Boolean | Platí pouze pro poslední položku |
$middle |
Boolean | Platí pro každou položku, která není ani první, ani poslední |
$even |
Boolean | Pravda, pokud je $index sudý |
$odd |
Boolean | Pravda, pokud je $index lichý |
Typické použití je kombinuje s ng-class pro zebra strips.ping, jako v ng-class="{'row-alt': $odd}", nebo pomocí ng-if pro vykreslení oddělovače na každém řádku kromě posledního, zapsaného ng-if="!$last"Zobrazení čísla řádku čitelného pro člověka je jednoduše {{$index + 1}}, protože index je založen na nule. Všech šest vlastností se automaticky přepočítává při každé změně kolekce, takže nic není třeba přepočítávat ručně.
Časté chyby ng-repeat a jak je opravit
Většina problémů s ng-repeat pramení z duplicitních hodnot, dědění rozsahu platnosti nebo z direktivy umístěné na nesprávném elementu. Každý níže uvedený příznak pojmenovává svou příčinu.
- Duplikáty v opakovači nejsou povoleny: Kolekce obsahuje opakující se hodnotu. Přidat
track by $index, nebo lépe,track byunikátní nemovitost. - Seznam nic nevykresluje: Název v zobrazení neodpovídá vlastnosti v oboru. Vytiskněte kolekci pomocí
{{TopicNames}}aby se potvrdilo, že dorazilo. - Každý prvek se opakuje, včetně obalovacího elementu: Příkaz ng-repeat byl umístěn na kontejner, nikoli na položku. Přesuňte ho do
<li>or<tr>. - Úprava vstupu změní nesprávný řádek: seznam je trackladen
$indexzatímco se položky mění pořadí. Track stabilním identifikátorem. - Změny uvnitř smyčky se neukládají: Každá iterace má svůj vlastní podřízený obor, takže zápis do primitiva vytváří lokální kopii. Zápis do vlastnosti objektu, například
item.done.




