Spec-Zone.ru › Angular.js 1.4

Улучшить эту документацию Просмотреть исходный код 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.

Перебор свойств объекта

Возможен перебор свойств объекта с использованием следующего синтаксиса:

<div ng-repeat="(key, value) in myObj"> ... </div>

Следует учитывать, что спецификация JavaScript не определяет порядок возвращаемых ключей для объекта. (Для минимизации этого в Angular 1.3 директива ngRepeat использовалась для сортировки ключей по алфавиту.)

В версии 1.4 сортировка по алфавиту была удалена. Теперь мы полагаемся на порядок, возвращаемый браузером при выполнении for key in myObj. Похоже, браузеры, как правило, следуют стратегии предоставления ключей в порядке их определения, хотя есть исключения при удалении и повторном добавлении ключей. См. страницу MDN по delete для получения дополнительной информации.

Если это нежелательно, рекомендуется преобразовать ваш объект в массив, отсортированный в требуемом порядке, прежде чем передавать его 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 не указано, оно эквивалентно отслеживанию с помощью встроенной функции $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.
  • Эта директива может использоваться как многоэлементная

Использование

  • как атрибут:
    <ANY
      ng-repeat="repeat_expression">
    ...
    </ANY>

Анимации

.enter - при добавлении нового элемента в список или когда элемент раскрывается после фильтрации

.leave - при удалении элемента из списка или когда элемент отфильтрован

.move - при фильтре смежных элементов, вызывающем переупорядочение, или при переупорядочении содержимого элемента

Нажмите здесь, чтобы узнать больше о шагах, участвующих в анимации.

Аргументы

Параметр Тип Описание
ngRepeat repeat_expression

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

  • variable in expression — где variable — определяемая пользователем переменная цикла, а 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.4.14/docs/api/ng/directive/ngRepeat

Spec-Zone.ru

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