Spec-Zone.ru › Angular.js 1.5

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

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

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

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

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

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

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

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

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

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

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

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

select as

Использование select as свяжет результат выражения select с моделью, но значение элементов html <select> и <option> будет либо индексом (для массивов данных) или именем свойства (для объектных источников данных) значения внутри коллекции. Если используется выражение 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"
      [name="string"]
      [required="string"]
      [ng-required="string"]
      [ng-options="comprehension_expression"]>
    ...
    </ANY>

Аргументы

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

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

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

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

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

Управляющий элемент считается валидным только при вводе значения.

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

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

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

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

Spec-Zone.ru

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