5

Как установить свойство value в ng-options AngularJS?

12

Вот что, похоже, беспокоит многих людей (включая меня).

При использовании директивы <code>ng-options</code> в AngularJS для заполнения опций тега <code>&lt;select&gt;</code>, я не могу понять, как установить значение для опции. Документация по этому поводу действительно неясна — по крайней мере, для простого смертного, как я.

Я могу легко установить текст для опции следующим образом:

ng-options="p.value as p.text for p in resultOptions"

Когда resultOptions выглядит, например, так:

[
    {
        "value": 1,
        "text": "1-й"
    },
    {
        "value": 2,
        "text": "2-й"
    }
]

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

5 ответ(ов)

1

Атрибуты значения (value) получают свои значения следующим образом:

  • При использовании массива в качестве источника данных (datasource) значением будет индекс элемента массива на каждой итерации;
  • При использовании объекта в качестве источника данных значением будет имя свойства на каждой итерации.

Таким образом, в вашем случае код будет выглядеть так:

obj = { '1': '1й', '2': '2й' };

<select ng-options="k as v for (k,v) in obj"></select>

Это позволит вам правильно связать значения и отображаемые метки в вашем элементе <select>.

0

Если вам нужно изменить значение ваших элементов 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 }}" />

Таким образом, ожидаемое значение будет отправлено через форму под правильным именем.

0

Согласно моему мнению, это решение лучше всего подходит для всех сценариев:

<select ng-model="mySelection.value">
   <option ng-repeat="r in myList" value="{{r.Id}}" ng-selected="mySelection.value == r.Id">{{r.Name}}
   </option>
</select>

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

0

Вместо использования новой функции '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' излишне и усложняет код.

0

Я решил эту проблему следующим образом. Я отслеживал выбор по значению и устанавливали свойство выбранного элемента в модели в моем 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'}.

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь