Spec-Zone.ru › Angular.js 1.5

Улучшить эту документацию Просмотреть исходный код ngRepeat

  1. директива в модуле 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

Выражение, указывающее, как перечислить коллекцию. В настоящее время поддерживаются следующие форматы:

  • variable in expression – где переменная — это определенная пользователем переменная цикла, а expression — это выражение контекста, предоставляющее коллекцию для перечисления.

    Например: album in artist.albums.

  • (key, value) in expression – где key и value могут быть любыми определенными пользователем идентификаторами, а expression — это выражение контекста, предоставляющее коллекцию для перечисления.

    Например: (name, age) in {'adam':10, 'amalie':12}.

  • variable in expression track by tracking_expression – Вы также можете указать необязательное выражение отслеживания, которое можно использовать для сопоставления объектов в коллекции с элементами DOM. Если выражение отслеживания не указано, ng-repeat сопоставляет элементы по идентичности. Ошибка — иметь более одного значения выражения отслеживания, разрешающегося на один и тот же ключ. (Это означало бы, что два разных объекта отображаются на один и тот же элемент DOM, что невозможно.)

    Обратите внимание, что выражение отслеживания должно стоять в конце, после любых фильтров и выражения псевдонима.

    Например: item in items эквивалентно item in items track by $id(item). Это подразумевает, что элементы DOM будут сопоставлены по идентичности элемента в массиве.

    Например: item in items track by $id(item). Встроенная функция $id() может быть использована для присвоения уникального свойства $$hashKey каждому элементу в массиве. Это свойство затем используется в качестве ключа для сопоставления элементов DOM с соответствующим элементом в массиве по идентичности. Перемещение одного и того же объекта в массиве переместит элемент DOM таким же образом в DOM.

    Например: item in items track by item.id — типичная модель, когда элементы поступают из базы данных. В этом случае идентичность объекта не имеет значения. Два объекта считаются эквивалентными, если их свойство id одинаково.

    Например: item in items | filter:searchText track by item.id — это шаблон, который может быть использован для применения фильтра к элементам в сочетании с выражением отслеживания.

  • variable in expression as alias_expression – Вы также можете указать необязательное выражение псевдонима, которое затем будет хранить промежуточные результаты повторения после применения фильтров. Обычно это используется для отображения специального сообщения, когда на повторении активен фильтр, но отфильтрованный результат пуст.

    Например: item in items | filter:x as results будет хранить фрагмент повторяемых элементов как results, но только после обработки элементов через фильтр.

    Обратите внимание, что `as [имя переменной] не является оператором, а скорее частью микросинтаксиса ngRepeat, поэтому он может использоваться только в конце (а не как оператор, внутри выражения).

    Например: item in items | filter : x | orderBy : order | limitTo : limit as results .

В этом примере используется 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API