Улучшить эту документацию Просмотреть исходный код ngRepeat
- директива в модуле ng
Директива ngRepeat создает шаблон один раз для каждого элемента из коллекции. Каждый экземпляр шаблона получает свою область видимости, где заданная переменная цикла присваивается текущему элементу коллекции, и $index присваивается индексу или ключу элемента.
В локальной области видимости каждого экземпляра шаблона доступны специальные свойства, включая:
| Переменная | Тип | Описание |
|---|---|---|
$index | number | смещение итератора повторяемого элемента (0..длина-1) |
$first | boolean | true, если повторяемый элемент является первым в итераторе. |
$middle | boolean | true, если повторяемый элемент находится между первым и последним в итераторе. |
$last | boolean | true, если повторяемый элемент является последним в итераторе. |
$even | boolean | true, если позиция итератора $index чётная (иначе false). |
$odd | boolean | true, если позиция итератора $index нечётная (иначе false). |
ngInit. Это может быть полезно, например, при вложенных ngRepeat.Итерация по свойствам объекта
Возможно получить ngRepeat итерацию по свойствам объекта, используя следующий синтаксис:
<div ng-repeat="(key, value) in myObj"> ... </div>
Однако, есть несколько ограничений по сравнению с итерацией по массивам:
-
Спецификация JavaScript не определяет порядок возвращаемых ключей для объекта, поэтому Angular полагается на порядок, возвращаемый браузером при выполнении
for key in myObj. Браузеры, как правило, следуют стратегии предоставления ключей в порядке их определения, хотя есть исключения, когда ключи удаляются и восстанавливаются. См. страницу MDN оdeleteдля получения дополнительной информации. -
ngRepeatбудет игнорировать свойства объекта, начинающиеся с$, так как это префикс, используемый Angular для публичных ($) и частных ($$) свойств. -
Встроенные фильтры orderBy и filter не работают с объектами и выбросят ошибку, если будут использованы с объектом.
Если вы сталкиваетесь с этими ограничениями, рекомендуется преобразовать объект в массив, отсортированный в желаемом порядке, перед передачей в ngRepeat. Это можно сделать с помощью фильтра, такого как toArrayFilter, или реализовать $watch для объекта самостоятельно.
Отслеживание и дубликаты
ngRepeat использует $watchCollection для обнаружения изменений в коллекции. При изменении ngRepeat вносит соответствующие изменения в DOM:
- При добавлении элемента новый экземпляр шаблона добавляется в DOM.
- При удалении элемента его экземпляр шаблона удаляется из DOM.
- При перестановке элементов соответствующие шаблоны переставляются в DOM.
Для минимизации создания элементов DOM, ngRepeat использует функцию для «отслеживания» всех элементов коллекции и соответствующих элементов DOM. Например, если в коллекцию добавлен элемент, ngRepeat будет знать, что у всех других элементов уже есть элементы DOM, и не будет перерисовывать их.
Функция отслеживания по умолчанию (которая отслеживает элементы по их идентичности) не допускает дубликатов элементов в массивах. Это связано с тем, что при наличии дубликатов невозможно поддерживать взаимно однозначное соответствие между элементами коллекции и элементами DOM.
Если вам нужно повторить дубликаты элементов, вы можете заменить стандартное поведение отслеживания собственным, используя выражение track by.
Например, вы можете отслеживать элементы по индексу каждого элемента в коллекции, используя специальное свойство области видимости $index:
<div ng-repeat="n in [42, 42, 43, 43] track by $index">
{{n}}
</div>
Вы также можете использовать произвольные выражения в track by, включая ссылки на пользовательские функции в области видимости:
<div ng-repeat="n in [42, 42, 43, 43] track by myTrackingFunction(n)">
{{n}}
</div>
ngRepeat не придётся перестраивать элементы DOM для уже отображаемых элементов, даже если JavaScript-объекты в коллекции были заменены новыми. Для больших коллекций это существенно улучшает производительность отображения. Если у вас нет уникального идентификатора, track by $index также может повысить производительность.<div ng-repeat="model in collection track by model.id">
{{model.name}}
</div>
track by $index когда повторяемый шаблон содержит однократные привязки. В таких случаях элемент DOM nth всегда будет сопоставляться с элементом nth массива, поэтому привязки к этому элементу не будут обновляться даже при изменении соответствующего элемента, что приводит к рассогласованию представления с базовыми данными.Когда выражение track by не указано, оно эквивалентно отслеживанию по встроенной функции $id , которая отслеживает элементы по их идентичности:
<div ng-repeat="obj in collection track by $id(obj)">
{{obj.prop}}
</div>
track by всегда должно быть последним выражением: <div ng-repeat="model in collection | orderBy: 'id' as filtered_result track by model.id">
{{model.name}}
</div>
Специальные точки начала и окончания повтора
Для повтора серии элементов, а не только одного родительского элемента, ngRepeat (а также другие ng директивы) поддерживают расширение диапазона повтора путём определения явных точек начала и окончания с помощью ng-repeat-start и ng-repeat-end соответственно. Директива ng-repeat-start работает так же, как ng-repeat, но повторит весь HTML-код (включая тэг, в котором она определена) до и включая закрывающий тэг, где расположена ng-repeat-end.
Пример ниже использует эту функцию:
<header ng-repeat-start="item in items">
Header {{ item }}
</header>
<div class="body">
Body {{ item }}
</div>
<footer ng-repeat-end>
Footer {{ item }}
</footer>
И с вводом ['A','B'] для переменной items в приведенном выше примере, вывод будет следующим:
<header> Header A </header> <div class="body"> Body A </div> <footer> Footer A </footer> <header> Header B </header> <div class="body"> Body B </div> <footer> Footer B </footer>
Пользовательские начальные и конечные точки для ngRepeat также поддерживают все другие варианты синтаксиса HTML-директивы, предоставляемые AngularJS (такие как data-ng-repeat-start, x-ng-repeat-start и ng:repeat-start).
Информация о директиве
- Данная директива создает новый контекст.
- Данная директива выполняется на уровне приоритета 1000.
- Данная директива может использоваться как multiElement
Использование
- в качестве элемента: (Данная директива может использоваться как пользовательский элемент, но имейте в виду ограничения IE).
<ng-repeat ng-repeat="repeat_expression"> ... </ng-repeat>
- в качестве атрибута:
<ANY ng-repeat="repeat_expression"> ... </ANY>
Анимации
| Анимация | Происходит |
|---|---|
| enter | при добавлении нового элемента в список или при отображении элемента после фильтрации |
| leave | при удалении элемента из списка или при удалении элемента в результате фильтрации |
| move | при фильтрации смежных элементов, вызывающей переупорядочивание, или при переупорядочивании содержимого элемента |
См. пример ниже для определения анимаций CSS с помощью ngRepeat.
Нажмите здесь, чтобы узнать больше о шагах, участвующих в анимации.Аргументы
| Параметр | Тип | Подробности |
|---|---|---|
| ngRepeat | repeat_expression | Выражение, указывающее, как перечислить коллекцию. В настоящее время поддерживаются следующие форматы:
|
В этом примере используется ngRepeat для отображения списка людей. Используется фильтр для ограничения отображаемых результатов по имени или возрасту. Новые (входящие) и удаленные (выходящие) элементы анимируются.
© 2010–2017 Google, Inc.
Licensed under the Creative Commons Attribution License 4.0.
https://code.angularjs.org/1.5.11/docs/api/ng/directive/ngRepeat