Как установить свойство value в ng-options AngularJS?
Вот что, похоже, беспокоит многих людей (включая меня).
При использовании директивы <code>ng-options</code>
в AngularJS для заполнения опций тега <code><select></code>
, я не могу понять, как установить значение для опции. Документация по этому поводу действительно неясна — по крайней мере, для простого смертного, как я.
Я могу легко установить текст для опции следующим образом:
ng-options="p.value as p.text for p in resultOptions"
Когда resultOptions
выглядит, например, так:
[
{
"value": 1,
"text": "1-й"
},
{
"value": 2,
"text": "2-й"
}
]
Это должно быть (и, вероятно, является) самой простой задачей — установить значения опций, но пока я просто не понимаю, как это сделать.
5 ответ(ов)
Атрибуты значения (value
) получают свои значения следующим образом:
- При использовании массива в качестве источника данных (
datasource
) значением будет индекс элемента массива на каждой итерации; - При использовании объекта в качестве источника данных значением будет имя свойства на каждой итерации.
Таким образом, в вашем случае код будет выглядеть так:
obj = { '1': '1й', '2': '2й' };
<select ng-options="k as v for (k,v) in obj"></select>
Это позволит вам правильно связать значения и отображаемые метки в вашем элементе <select>
.
Если вам нужно изменить значение ваших элементов option
, потому что форма в итоге будет отправлена на сервер, вместо этого:
<select name="text" ng-model="text" ng-options="select p.text for p in resultOptions"></select>
Вы можете сделать так:
<select ng-model="text" ng-options="select p.text for p in resultOptions"></select>
<input type="hidden" name="text" value="{{ text }}" />
Таким образом, ожидаемое значение будет отправлено через форму под правильным именем.
Согласно моему мнению, это решение лучше всего подходит для всех сценариев:
<select ng-model="mySelection.value">
<option ng-repeat="r in myList" value="{{r.Id}}" ng-selected="mySelection.value == r.Id">{{r.Name}}
</option>
</select>
В этом примере вы можете использовать свою модель для привязки данных. Вы получите значение, которое содержит объект, а также значение по умолчанию на основе вашего сценария.
Вместо использования новой функции 'track by' вы можете просто сделать это с помощью массива, если хотите, чтобы значения совпадали с текстом:
<select ng-options="v as v for (k,v) in Array/Obj"></select>
Обратите внимание на разницу между стандартным синтаксисом, который сделает значениями ключи объекта/массива, и поэтому они будут равны 0, 1, 2 и так далее для массива:
<select ng-options="k as v for (k,v) in Array/Obj"></select>
В этом случае k as v становится v as v.
Я сделал это открытие, основываясь на здравом смысле, глядя на синтаксис. (k,v) – это фактически конструкция, которая разбивает массив/объект на пары ключ-значение.
В выражении 'k as v' k будет значением, а v – текстовым вариантом, отображаемым пользователю. Я считаю, что использование 'track by' излишне и усложняет код.
Я решил эту проблему следующим образом. Я отслеживал выбор по значению и устанавливали свойство выбранного элемента в модели в моем JavaScript-коде.
Countries = [
{
CountryId: 1, Code: 'USA', CountryName: 'United States of America'
},
{
CountryId: 2, Code: 'CAN', CountryName: 'Canada'
}
];
<select ng-model="vm.Enterprise.AdminCountry" ng-options="country.CountryName for country in vm.Countries track by country.CountryId"></select>
Здесь vm
- это мой контроллер, а страна, полученная из сервиса в контроллере, представляет собой объект {CountryId: 1, Code: 'USA', CountryName: 'United States of America'}
.
Когда я выбрал другую страну из выпадающего списка и отправил страницу с помощью кнопки "Сохранить", я получил правильную страну, привязанную к модели.
В чем разница между angular-route и angular-ui-router?
Работа с $scope.$emit и $scope.$on в AngularJS
Вставка HTML в представление из контроллера AngularJS
Как привязать значения списка чекбоксов в AngularJS?
Может ли один контроллер AngularJS вызывать другой?