Директива AngularJS ng-repeat с примером
⚡ Умное резюме
Директива ng-repeat в AngularJS отображает одну копию элемента для каждого элемента в коллекции, определенной в области видимости контроллера. Она преобразует массив в список, таблицу или любую повторяющуюся разметку без написания цикла вручную.

Директива ng-repeat в AngularJS
нг-повторить Директивы В AngularJS ng-repeat используется для отображения повторяющихся значений, определенных в контроллере. Иногда нам нужно показать список элементов в представлении, и ng-repeat отображает список, определенный в контроллере, на странице представления.
⚠️ Уведомление службы поддержки: AngularJS достиг Прекращение поддержки 31 декабря 2021 года. и не получает дальнейших исправлений или обновлений безопасности. Приведенная ниже директива остается актуальной для поддержки существующих приложений AngularJS 1.x; в современных Угловой эквивалентом является *ngFor структурная директива.
Пример директивы AngularJS ng-repeat
Рассмотрим пример директивы ng-repeat в 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 Объяснение:
- В контроллерСначала мы определяем массив элементов списка, которые будут отображаться в представлении. Здесь массив называется
TopicNamesСодержит три элемента, каждый из которых представляет собой пару "имя-значение". - Массив назначается непосредственно
$scope.TopicNames, что делает его доступным для представления, привязанного к этому контроллеру. - HTML-теги
<ul>(неупорядоченный список) и<li>(элемент списка) отображает элементы. Директива ng-repeat перебирает каждую запись в массиве, иtpname— это локальная переменная, содержащая текущий элемент, поэтому{{tpname.name}}выводит свойство имени.
⚠️ Исправление: В первоначальном объяснении говорилось, что массив был «добавлен в переменную-член, называемую topics«В коде такой переменной не существует — массиву присваивается значение напрямую». $scope.TopicNames, что и является именем, на которое ссылается представление. Введение второго имени здесь часто приводит к появлению пустого списка.
Если код будет выполнен успешно, в браузере отобразится следующий результат.
Несколько контроллеров AngularJS
Ранее мы рассматривали единый контроллер, в котором один метод обрабатывал как сложение, так и вычитание.tracВместо чисел можно использовать несколько контроллеров для более четкого разделения логики. Например, один контроллер может работать с числами, а другой — со строками.
Рассмотрим пример определения нескольких контроллеров в приложении 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 Объяснение:
- Определены два контроллера.
firstcontrollerиsecondcontrollerКаждый из них прикрепляет переменную к своей собственной. сфера:pnameв первом случае,lnameВ секунду. - В представлении второй контроллер вложен в первый, и выражение выглядит следующим образом:
lnameиз внутренней области видимости. Поскольку вложенный контроллер наследует от своего родителя,{{pname}}Здесь также разрешится вопрос — наследство передается вниз, а не вверх.
Если код будет выполнен успешно, отобразится текст. второй контроллер отображается.
Как использовать track с помощью ng-повтора
Наиболее распространенная ошибка при выполнении команды ng-repeat — это ошибка. Duplicates in a repeater are not allowedЭта ошибка появляется в тот момент, когда коллекция содержит одно и то же значение дважды, и это полностью останавливает отрисовку списка.
Причина – идентичность. tracкороль. AngularJS нужен стабильный ключ для каждого элемента, чтобы он мог повторно использовать узлы DOM, а не перестраивать их при каждом обновлении. По умолчанию он использует само значение элемента, поэтому два одинаковых значения конфликтуют.
<!-- 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> <!-- лучших for records from a server: track by a real identifier --> <li ng-repeat="topic in TopicNames track by topic.id">{{topic.name}}</li>
Выбор между этими двумя формами имеет большее значение, чем кажется на первый взгляд. Tracking by $index Это всегда устраняет ошибку, поскольку позиция по определению уникальна, но при этом каждый узел DOM привязывается к слоту, а не к записи. Переупорядочивание или фильтрация коллекции затем повторно использует неправильные узлы, что отображается как некорректное отображение полей ввода.ping текст предыдущей строки.
Tracking с помощью подлинного идентификатора, такого как topic.id Это позволяет полностью избежать подобных проблем. AngularJS может отслеживать каждую запись по мере её перемещения, поэтому он переупорядочивает существующие узлы вместо того, чтобы уничтожать и создавать их заново. На длинных списках это также значительно быстрее, поскольку повторная отрисовка затрагивает только те строки, которые фактически изменились. Используйте $index только для массивов простых значений, которые никогда не переупорядочиваются.
Особые возможности, доступные внутри ng-repeat
Каждая итерация ng-repeat предоставляет несколько свойств только для чтения в своей дочерней области видимости. Они описывают положение текущего элемента в коллекции, включая нумерацию, чередование стилей и разделители, без добавления какого-либо дополнительного состояния в контроллер.
| Свойства | Тип | Значение |
|---|---|---|
$index |
Номер регистрации | Положение текущего элемента, начиная с 0. |
$first |
Логический | Это справедливо только для первого пункта. |
$last |
Логический | Это относится только к последнему товару. |
$middle |
Логический | Это верно для каждого элемента, который не является ни первым, ни последним. |
$even |
Логический | Верно, когда $index четное |
$odd |
Логический | Верно, когда $index нечетное значение |
Типичный пример использования — сочетание их с ng-class для полосок зебры.ping, Как в ng-class="{'row-alt': $odd}"или с помощью ng-if для отображения разделителя во всех строках, кроме последней, ng-if="!$last"Отображение удобочитаемого номера строки — это просто. {{$index + 1}}Поскольку индекс начинается с нуля, все шесть свойств автоматически пересчитываются при каждом изменении коллекции, поэтому ничего не нужно пересчитывать вручную.
Распространенные ошибки ng-repeat и способы их исправления
Большинство проблем с ng-repeat возникают из-за дублирующихся значений, наследования области видимости или размещения директивы на неправильном элементе. Для каждого симптома ниже указана его причина.
- Создание дубликатов в повторителе запрещено: Коллекция обладает повторяющейся ценностью. Добавить
track by $index, или лучше,track byУникальная недвижимость. - Список ничего не отображает: Имя в представлении не соответствует свойству в области видимости. Выведите коллекцию с помощью
{{TopicNames}}чтобы подтвердить его прибытие. - Все элементы повторяются, включая обертку: ng-repeat был размещен на контейнере, а не на самом элементе. Переместите его туда.
<li>or<tr>. - При редактировании поля ввода изменяется не та строка: список tracked по
$indexпока товары переупорядочиваются. TracВместо этого используйте стабильный идентификатор для преобразования k в k. - Изменения внутри цикла не сохраняются: Каждая итерация имеет свою собственную дочернюю область видимости, поэтому запись в примитивный тип данных создает локальную копию. Запись в свойство объекта, например,
item.done.




