Содержание

select

Беглый обзор

HTML-элемент select с привязкой к данным AngularJS.

Директива select используется вместе с ngModel для обеспечения привязки данных между областью действия и элементом управления select (включая установку значений по умолчанию). Он также обрабатывает динамические элементы опций, которые могут быть добавлены с помощью директив ngRepeat или ngOptions.

Когда выбран элемент в меню выбора, значение выбранного параметра будет привязано к модели, определенной директивой ngModel. В случае статических или повторяющихся параметров это содержимое атрибута значения или textContent параметра, если атрибут значения отсутствует. Значение и textContent могут быть интерполированы.

Соответствие модели и значения параметров

Как правило, соответствие между моделью и параметром оценивается путем строгого сравнения значения модели со значением доступных параметров.

Если вы устанавливаете значение параметра с помощью атрибута значения параметра или textContent, значение всегда будет строкой, что означает, что значение модели также должно быть строкой. В противном случае директива select не может соответствовать им правильно.

Если viewValue ngModel не соответствует ни одному из параметров, тогда элемент управления автоматически добавит «неизвестный» параметр, который затем удаляется при устранении несоответствия.

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

Выбор между ngRepeat и ngOptions

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

В частности, выбор с повторяющимися параметрами значительно замедляется, начиная с 2000 вариантов в Chrome и Internet Explorer / Edge.

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

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

Параметры директивы

как элемент:

  ng-model="string"
  [name="string"]
  [multiple="string"]
  [required="string"]
  [ng-required="string"]
  [ng-change="string"]
  [ng-options="string"]
  [ng-attr-size="string"]>
...
ПараметрТипДетали
ngModelstringНазначаемое выражение AngularJS для привязки данных.
name(optional)stringИмя свойства формы, под которой публикуется элемент управления.
multiple(optional)stringПозволяет выбрать несколько вариантов. Выбранные значения будут привязаны к модели в виде массива.
required(optional)stringУстанавливает требуемый ключ ошибки проверки, если значение не введено.
ngRequired(optional)stringДобавляет обязательный атрибут и обязательное ограничение проверки к элементу, когда выражение ngRequired оценивается как true. Используйте ngRequired вместо require, если вы хотите привязать данные к необходимому атрибуту.
ngChange(optional)stringВыражение AngularJS, которое будет выполнено, когда выбранные опции изменяются из-за взаимодействия пользователя с элементом select.
ngOptions(optional)stringУстанавливает параметры, которыми наполнен select, и определяет, что устанавливается в модели при выборе. Смотрите ngOptions.
ngAttrSize(optional)stringУстанавливает размер выбранного элемента динамически. Использует директиву ngAttr.

Примеры

Простой выбор элементов со статическими параметрами

index.html

<div ng-controller="ExampleController">
  <form name="myForm">
    <label for="singleSelect"> Single select: </label><br>
    <select name="singleSelect" ng-model="data.singleSelect">
      <option value="option-1">Option 1</option>
      <option value="option-2">Option 2</option>
    </select><br>
 
    <label for="singleSelect"> Single select with "not selected" option and dynamic option values: </label><br>
    <select name="singleSelect" id="singleSelect" ng-model="data.singleSelect">
      <option value="">---Please select---</option> <!-- not selected / blank option -->
      <option value="{{data.option1}}">Option 1</option> <!-- interpolation -->
      <option value="option-2">Option 2</option>
    </select><br>
    <button ng-click="forceUnknownOption()">Force unknown option</button><br>
    <tt>singleSelect = {{data.singleSelect}}</tt>
 
    <hr>
    <label for="multipleSelect"> Multiple select: </label><br>
    <select name="multipleSelect" id="multipleSelect" ng-model="data.multipleSelect" multiple>
      <option value="option-1">Option 1</option>
      <option value="option-2">Option 2</option>
      <option value="option-3">Option 3</option>
    </select><br>
    <tt>multipleSelect = {{data.multipleSelect}}</tt><br/>
  </form>
</div>

app.js

 
angular.module('staticSelect', [])
 .controller('ExampleController', ['$scope', function($scope) {
   $scope.data = {
    singleSelect: null,
    multipleSelect: [],
    option1: 'option-1'
   };
 
   $scope.forceUnknownOption = function() {
     $scope.data.singleSelect = 'nonsense';
   };
}]);

Использование ngRepeat для генерации опций select

index.html

<div ng-controller="ExampleController">
  <form name="myForm">
    <label for="repeatSelect"> Repeat select: </label>
    <select name="repeatSelect" id="repeatSelect" ng-model="data.model">
      <option ng-repeat="option in data.availableOptions" value="{{option.id}}">{{option.name}}</option>
    </select>
  </form>
  <hr>
  <tt>model = {{data.model}}</tt><br/>
</div>
angular.module('ngrepeatSelect', [])
 .controller('ExampleController', ['$scope', function($scope) {
   $scope.data = {
    model: null,
    availableOptions: [
      {id: '1', name: 'Option A'},
      {id: '2', name: 'Option B'},
      {id: '3', name: 'Option C'}
    ]
   };
}]);

Использование ngValue для привязки модели к массиву объектов

index.html

 
<div ng-controller="ExampleController">
  <form name="myForm">
    <label for="ngvalueselect"> ngvalue select: </label>
    <select size="6" name="ngvalueselect" ng-model="data.model" multiple>
      <option ng-repeat="option in data.availableOptions" ng-value="option.value">{{option.name}}</option>
    </select>
  </form>
  <hr>
  <pre>model = {{data.model | json}}</pre><br/>
</div>

app.js

 
angular.module('ngvalueSelect', [])
 .controller('ExampleController', ['$scope', function($scope) {
   $scope.data = {
    model: null,
    availableOptions: [
         {value: 'myString', name: 'string'},
         {value: 1, name: 'integer'},
         {value: true, name: 'boolean'},
         {value: null, name: 'null'},
         {value: {prop: 'value'}, name: 'object'},
         {value: ['a'], name: 'array'}
    ]
   };
}]);

Использование select с ngOptions и установка значения по умолчанию

index.html

 
<div ng-controller="ExampleController">
  <form name="myForm">
    <label for="mySelect">Make a choice:</label>
    <select name="mySelect" id="mySelect"
      ng-options="option.name for option in data.availableOptions track by option.id"
      ng-model="data.selectedOption"></select>
  </form>
  <hr>
  <tt>option = {{data.selectedOption}}</tt><br/>
</div>

app.js

angular.module('defaultValueSelect', [])
 .controller('ExampleController', ['$scope', function($scope) {
   $scope.data = {
    availableOptions: [
      {id: '1', name: 'Option A'},
      {id: '2', name: 'Option B'},
      {id: '3', name: 'Option C'}
    ],
    selectedOption: {id: '3', name: 'Option C'} //This sets the default value of the select in the ui
    };
}]);

Привязка select к нестроковому значению с помощью парсинга/форматирования ngModel

index.html

<select ng-model="model.id" convert-to-number>
  <option value="0">Zero</option>
  <option value="1">One</option>
  <option value="2">Two</option>
</select>
{{ model }}

app.js

 
angular.module('nonStringSelect', [])
.run(function($rootScope) {
  $rootScope.model = { id: 2 };
})
.directive('convertToNumber', function() {
  return {
    require: 'ngModel',
    link: function(scope, element, attrs, ngModel) {
      ngModel.$parsers.push(function(val) {
        return parseInt(val, 10);
      });
      ngModel.$formatters.push(function(val) {
        return '' + val;
      });
    }
  };
});

protractor.js

 
it('should initialize to model', function() {
  expect(element(by.model('model.id')).$('option:checked').getText()).toEqual('Two');
});