Spec-Zone.ru › Angular.js 1.8

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

  1. Директива в модуле ng

Обзор

Атрибут ngOptions может использоваться для динамической генерации списка элементов <option> для элемента <select> с использованием массива или объекта, полученного в результате вычисления выражения ngOptions.

Во многих случаях, ngRepeat может использоваться для элементов <option> вместо ngOptions, чтобы достичь аналогичного результата. Однако, ngOptions предоставляет некоторые преимущества:

  • большая гибкость в способе присвоения модели <select> через часть выражения select as
  • снижение потребления памяти за счёт отсутствия создания нового контекста для каждого повторяющегося экземпляра
  • увеличение скорости отрисовки за счёт создания опций в документе-фрагменте вместо индивидуального создания

При выборе элемента в раскрывающемся списке <select>, элемент массива или свойство объекта, представленные выбранной опцией, будут связаны с моделью, определённой директивой ngModel.

Необязательно, единственный жёстко закодированный элемент <option>, со значением, установленным в пустую строку, может быть вложен в элемент <select>. Этот элемент будет представлять значение по умолчанию или "не выбранную" опцию. Пример демонстрируется ниже.

Сложные модели (объекты или коллекции)

По умолчанию, ngModel отслеживает модель по ссылке, а не по значению. Это важно знать при связывании выбора с моделью, являющейся объектом или коллекцией.

Возникает проблема, если необходимо выбрать опцию по умолчанию. Например, если вы установите модель в объект, равный объекту в вашей коллекции, ngOptions не сможет установить выбор, потому что объекты не идентичны. Поэтому по умолчанию вы всегда должны ссылаться на элемент в вашей коллекции для предварительного выбора, например: $scope.selected = $scope.collection[3].

Другое решение - использовать track by предложение, поскольку тогда ngOptions будет отслеживать идентичность элемента не по ссылке, а по результату вычисления выражения track by. Например, если элементы вашей коллекции имеют свойство id, вы бы track by item.id.

Ещё одна проблема с объектами или коллекциями заключается в том, что ngModel не обнаружит, если свойство объекта или элемент коллекции изменятся. По этой причине ngOptions дополнительно отслеживает модель, используя $watchCollection, когда выражение содержит track by предложение или элемент select имеет атрибут multiple. Это позволяет ngOptions инициировать повторную отрисовку опций даже если сам объект/коллекция не изменилась, а изменилось только свойство объекта или элемент коллекции.

Обратите внимание, что $watchCollection выполняет поверхностное сравнение свойств объекта (или элементов коллекции, если модель является массивом). Это означает, что изменение свойства на уровне ниже первого уровня внутри объекта/коллекции не вызовет повторной отрисовки.

select as

Использование select as свяжет результат выражения select с моделью, но значение элементов <select> и <option> html будет либо индексом (для массивов данных) или именем свойства (для объектов данных) значения в коллекции. Если используется выражение track by, результат этого выражения будет установлен как значение элементов option и select.

select as и track by

Будьте внимательны при использовании select as и track by в одном выражении.

Учитывая этот массив элементов в $scope:

$scope.items = [{
  id: 1,
  label: 'aLabel',
  subItem: { name: 'aSubItem' }
}, {
  id: 2,
  label: 'bLabel',
  subItem: { name: 'bSubItem' }
}];

Это будет работать:

<select ng-options="item as item.label for item in items track by item.id" ng-model="selected"></select>
$scope.selected = $scope.items[0];

но это не будет работать:

<select ng-options="item.subItem as item.label for item in items track by item.id" ng-model="selected"></select>
$scope.selected = $scope.items[0].subItem;

В обоих примерах выражение track by успешно применяется к каждому item в массиве items. Поскольку выбранная опция была задана программно в контроллере, выражение track by также применяется к значению ngModel. В первом примере значение ngModel равно items[0], а выражение track by вычисляется до items[0].id без проблем. Во втором примере значение ngModel равно items[0].subItem, а выражение track by вычисляется до items[0].subItem.id (что является неопределённым). В результате значение модели не соответствует ни одному <option>, и <select> отображается как не имеющее выбранного значения.

Информация о директиве

  • Данная директива выполняется на уровне приоритета 0.

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

  • в качестве атрибута:
    <ANY
      ng-model="string"
      ng-options="comprehension_expression"
      [name="string"]
      [required="string"]
      [ng-required="string"]
      [ng-attr-size="string"]>
    ...
    </ANY>

Аргументы

Параметр Тип Подробности
ngModel string

Присваиваемое выражение AngularJS для привязки к данным.

ngOptions comprehension_expression

в одном из следующих форматов:

  • для источников данных в виде массива:
    • label for value in array
    • select as label for value in array
    • label group by group for value in array
    • label disable when disable for value in array
    • label group by group for value in array track by trackexpr
    • label disable when disable for value in array track by trackexpr
    • label for value in array | orderBy:orderexpr track by trackexpr (для включения фильтра с track by)
  • для источников данных в виде объекта:
    • label for (key , value) in object
    • select as label for (key , value) in object
    • label group by group for (key, value) in object
    • label disable when disable for (key, value) in object
    • select as label group by group for (key, value) in object
    • select as label disable when disable for (key, value) in object

Где:

  • array / object: выражение, которое вычисляется в массив / объект для итерации.
  • value: локальная переменная, которая будет ссылаться на каждый элемент в array или каждое значение свойства объекта object во время итерации.
  • key: локальная переменная, которая будет ссылаться на имя свойства в object во время итерации.
  • label: Результат этого выражения будет меткой для элемента <option>. Вероятно, expression будет ссылаться на переменную value (например, value.propertyName).
  • select: Результат этого выражения будет привязан к модели родительского элемента <select> . Если не указано, выражение select по умолчанию будет value.
  • group: Результат этого выражения будет использован для группировки опций с помощью элемента <optgroup> DOM.
  • disable: Результат этого выражения будет использован для отключения рендерируемого элемента <option>. Верните true для отключения.
  • trackexpr: Используется при работе с массивом объектов. Результат этого выражения будет использован для идентификации объектов в массиве. Вероятно, trackexpr будет ссылаться на переменную value (например, value.propertyName). С помощью этого сохраняется выбор даже при пересоздании опций (например, при повторной загрузке с сервера).
name
(необязательно)
string

Имя свойства формы, под которым элемент управления публикуется.

required
(необязательно)
string

Элемент управления считается валидным только при вводе значения.

ngRequired
(необязательно)
string

Добавляет атрибут required и ограничение валидации required к элементу, когда выражение ngRequired вычисляется как true. Используйте ngRequired вместо required, когда вы хотите привязать данные к атрибуту required.

ngAttrSize
(необязательно)
string

динамически устанавливает размер элемента select. Использует директиву ngAttr.

Пример

© 2010–2020 Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
https://code.angularjs.org/1.8.2/docs/api/ng/directive/ngOptions

Spec-Zone.ru

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