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

528

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

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

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

ng-options="select p.text for p in resultOptions"

Если resultOptions - это, например:

[
    {
        "value": 1,
        "text": "1st"
    },
    {
        "value": 2,
        "text": "2nd"
    }
]

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

  • 12
    Была та же проблема, потому что я не нашел документы (как показано ниже) очень ясно.
  • 1
    Использование «select» в том виде, как оно изображено в вопросе, по существу неверно, потому что «select» в этом контексте не является ключевым словом, но является заполнителем для выражения. Это из документации AngularJS: «select: результат этого выражения будет привязан к модели родительского элемента. Если не указан, выражение select по умолчанию будет иметь значение.» Я предоставил более подробную информацию в моем ответе ниже.
Показать ещё 3 комментария
Теги:

27 ответов

665
Лучший ответ

См. NgOptions

ngOptions (необязательно) - { comprehension_expression= } - в одной из следующих форм:

Для источников данных массива: label for value in array select as label for value in array label group by group for value in array select as label for value in array label group by group for value in array select as label group by group for value in array track by trackexpr Для источников данных объекта: label for (key, value) in object select as label for (key, value) in object label group by group for (key, value) in object select as label for (key, value) in object label group by group for (key, value) in object select as label group by group for (key, value) in object

В вашем случае это должно быть

array = [{ "value": 1, "text": "1st" }, { "value": 2, "text": "2nd" }];

<select ng-options="obj.value as obj.text for obj in array"></select>

Обновить

С обновлениями на AngularJS теперь можно установить фактическое значение для атрибута value элемента select с track by выражения track by.

<select ng-options="obj.text for obj in array track by obj.value">
</select>

Как помнить этот уродливый материал

Для всех людей, которым трудно запоминать эту синтаксическую форму: я согласен, что это не самый простой или красивый синтаксис. Этот синтаксис является разновидностью расширенной версии интерпретаций списка Python и знает, что помогает мне очень легко запомнить синтаксис. Это что-то вроде этого:

Код Python:

my_list = [x**2 for x in [1, 2, 3, 4, 5]]
> [1, 4, 9, 16, 25]

# Let people to be a list of person instances
my_list2 = [person.name for person in people]
> my_list2 = ['Alice', 'Bob']

Это фактически тот же синтаксис, что и первый из перечисленных выше. Однако в <select> нам обычно нужно различать фактическое значение в коде и отображаемый текст (метка) в элементе <select>.

Например, нам нужен person.id в коде, но мы не хотим показывать id пользователю; мы хотим показать его имя. Точно так же мы не интересуемся person.name в коде. В as ключевого слова используется ключевое слово. Так оно и будет:

person.id as person.name for person in people

Или, вместо person.id нам может понадобиться сам экземпляр/ссылка на person. Смотри ниже:

person as person.name for person in people

Для объектов JavaScript применяется тот же метод. Просто помните, что элементы в объекте деконструируются парами (key, value).

  • 33
    Ваш пример не заполняет значение атрибута option. Он определяет, что будет храниться в модели элемента <select>. Смотрите разницу между obj.value как obj.text и obj.text
  • 0
    Он заполняет атрибут option с помощью obj.value . Как в вашем примере.
Показать ещё 24 комментария
137

Как атрибуты значения получают свое значение:

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

Итак, в вашем случае это должно быть:

obj = { '1': '1st', '2': '2nd' };

<select ng-options="k as v for (k,v) in obj"></select>
  • 15
    +1 за объяснение того, как Angular устанавливает атрибут значения элементов option.
  • 1
    Это не устанавливает значение. Значения по умолчанию для чисел. Но вы не можете указать «значение» .. смешно ..
Показать ещё 8 комментариев
121

У меня тоже была эта проблема. Мне не удалось установить значение в ng-опциях. Каждый сгенерированный параметр был установлен с помощью 0, 1,..., n.

Чтобы все было правильно, я сделал что-то подобное в моих ng-вариантах:

HTML:

<select ng-options="room.name for room in Rooms track by room.price">
    <option value="">--Rooms--</option>
</select>

Я использую "track by" для установки всех моих значений с помощью room.price.

(Этот пример отстой: потому что если бы было более одной цены, код не сработает. Поэтому УБЕДИТЕСЬ, чтобы иметь разные значения.)

JSON:

$scope.Rooms = [
            { name: 'SALA01', price: 100 },
            { name: 'SALA02', price: 200 },
            { name: 'SALA03', price: 300 }
        ];

Я узнал об этом из сообщения в блоге Как установить начальное выбранное значение элемента select с помощью Angular.JS ng-options и track by.

Смотрите видео. Это хороший класс:)

  • 8
    Это работает отлично. Кроме того, он позволяет использовать элемент списка данных с <select>, чтобы он мог ссылаться на параметры через их значение. Спасибо @ Бруно Гомес
  • 3
    это единственное решение, которое работает для меня. Благодарю.
Показать ещё 13 комментариев
46

Если вы хотите изменить значение своих элементов 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
    этот работает как шарм.
  • 2
    Я бы добавил, что вместо использования <input type="hidden" name="text" value="{{ text }}" /> я бы использовал ng-value . Итак: <input type="hidden" name="text" ng-value="{{ text }}" /> .
Показать ещё 3 комментария
24

Чтобы отправить пользовательское значение my_hero на сервер, используя обычную форму submit:

JSON:

"heroes": [
  {"id":"iron", "label":"Iron Man Rocks!"},
  {"id":"super", "label":"Superman Rocks!"}
]

HTML:

<select ng-model="hero" ng-options="obj.id as obj.label for obj in heroes"></select>
<input type="hidden" name="my_hero" value="{{hero}}" />

Сервер получит либо iron, либо super как значение my_hero.

Это похоже на ответ @neemzy, но указав отдельные данные для атрибута value.

24

Похоже, что ng-options сложно (возможно, разочаровывает), но на самом деле у нас есть проблема архитектуры.

AngularJS служит основой MVC для динамического приложения HTML + JavaScript. В то время как его компонент (V) iew предлагает HTML-шаблоны, его основная цель - связать действия пользователя с помощью контроллера с изменениями в модели. Поэтому соответствующий уровень абстракции, из которого можно работать в AngularJS, заключается в том, что элемент select устанавливает значение в модели в значение из запроса.

  • Как строка запроса представляется пользователю - это проблема (V) и ng-options предоставляет ключевое слово for, чтобы определить, что должно содержать содержимое элемента option, а именно p.text for p in resultOptions.
  • Как выбранная строка представлена ​​серверу - это проблема (M). Поэтому ng-options предоставляет ключевое слово as, чтобы указать, какое значение предоставляется модели, как в k as v for (k,v) in objects.

Правильное решение этой проблемы является архитектурным по своей природе и включает в себя рефакторинг вашего HTML, так что (M) odel выполняет связь с сервером, когда требуется (вместо пользователя, отправляющего форму).

Если HTML-страница MVC не требует излишней инженерии для данной проблемы:, то используйте только часть генерации HTML компонента AngularJSs (V). В этом случае следуйте той же схеме, которая используется для генерации таких элементов, как &lt;li /&gt; в разделе &lt;ul /&gt;, и поместите ng-repeat в элемент option:

<select name="value">
    <option ng-repeat="value in Model.Values" value="{{value.value}}">
        {{value.text}}
    </option>
</select>

Как kludge, всегда можно переместить атрибут name элемента select на скрытый элемент ввода:

<select ng-model="selectedValue" ng-options="value.text for value in Model.Values">
</select>
<input type="hidden" name="value" value="{{selectedValue}}" />
  • 0
    плохая производительность при использовании ng-repeat для элемента option, возможно? вы должны использовать ng-options на самом select.
  • 0
    @DrCord: использование ng-repeat для элемента option предлагается в качестве решения только в единичных случаях (когда правильные HTML-страницы MVC не требуют чрезмерного проектирования). Может быть, downvoter не готовил это очень близко. Будет отредактировано, чтобы более конкретно указать, что ng-repeat для элемента option не является идеальным случаем.
Показать ещё 3 комментария
19

Вы можете сделать это:

<select ng-model="model">
    <option value="">Select</option>
    <option ng-repeat="obj in array" value="{{obj.id}}">{{obj.name}}</option>
</select>

- ОБНОВЛЕНИЕ

После некоторых обновлений пользовательское решение frm.adiputra намного лучше. Код:

obj = { '1': '1st', '2': '2nd' };
<select ng-options="k as v for (k,v) in obj"></select>
  • 8
    Лучше использовать ng-options внутри элемента / директивы select. Например, <select ng-model = "model" ng-options = "obj.id как obj.name для obj в массиве">. То, что у вас есть, работает, но не будет работать с другими конструкциями Angular. Например, этот ng-щелчок не будет работать с вашим кодом: <a ng-click="model=1"> выберите 1 </a>, но он работает, если используются ng-options.
  • 7
    Этот ответ неверен! Вы должны использовать ng-options
Показать ещё 1 комментарий
13

Сегодня я боролся с этой проблемой. Я прочитал документацию AngularJS, эту и другие сообщения и несколько блогов, к которым они ведут. Все они помогли мне получить более тонкие детали, но, в конце концов, это просто путающая тема. Главным образом из-за множества синтаксических нюансов ng-options.

В конце концов, для меня это сократилось дольше.

Учитывая область, сконфигурированную следующим образом:

        //Data used to populate the dropdown list
        $scope.list = [
           {"FirmnessID":1,"Description":"Soft","Value":1},         
           {"FirmnessID":2,"Description":"Medium-Soft","Value":2},
           {"FirmnessID":3,"Description":"Medium","Value":3}, 
           {"FirmnessID":4,"Description":"Firm","Value":4},     
           {"FirmnessID":5,"Description":"Very Firm","Value":5}];

        //A record or row of data that is to be save to our data store.
        //FirmnessID is a foreign key to the list specified above.
        $scope.rec = {
           "id": 1,
           "FirmnessID": 2
        };

Это все, что мне нужно для получения желаемого результата:

        <select ng-model="rec.FirmnessID"
                ng-options="g.FirmnessID as g.Description for g in list">
            <option></option>
        </select>   

Примечание. Я не использовал track by. Используя track by, выбранный элемент всегда возвращал объект, который соответствовал бы идентификатору FirmnessID, а не самому FirmnessID. Теперь это соответствует моим критериям, а именно, что оно должно возвращать числовое значение, а не объект, и использовать ng-options для улучшения производительности, предоставляемого им, не создавая новую область для каждой сгенерированной опции.

Кроме того, мне нужна пустая первая строка, поэтому я просто добавил элемент <option> в элемент <select>.

Вот Plunkr, который показывает мою работу.

  • 0
    Легенда. Это именно то, что мне было нужно. Спасибо
  • 0
    Отлично, но каково назначение клавиш «Значение»? Они не кажутся необходимыми.
Показать ещё 2 комментария
10

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

Я обнаружил это только на основе здравого смысла, рассматривающего синтаксис. (k, v) - это фактический оператор, который разбивает массив/объект на пары значений ключа.

В операторе "k as v" значение k будет значением, а v будет отображаться пользователем. Я думаю, что "трек" - грязный и переполненный.

  • 1
    это не работает для массивов
  • 0
    Waaaaat? Работает для массивов повсюду на моих страницах, мы используем ту же версию AngularJS?
9

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

<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
    Люблю это решение. Их угловые помощники для этой директивы излишне сложны. Спасибо за то, что вы самопровозглашенный судья использования.
8

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

vm - мой контроллер, а страна в контроллере, полученном из службы, - {CountryId =1, Code = 'USA', CountryName='United States of America'}.

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

7

Директива ng-options не устанавливает атрибут value для элементов <options> для массивов:

Использование limit.value as limit.text for limit in limits означает:

установите метку <option> как limit.text
сохраните значение limit.value в списке ng-model

См. Stack Вопрос переполнения Параметры AngularJS ng, не отображающие значения.

4
<select ng-model="color" ng-options="(c.name+' '+c.shade) for c in colors"></select><br>
3

Для меня ответ Бруно Гомеса - лучший ответ.

Но на самом деле вам не нужно беспокоиться о настройке свойства value для опций select. AngularJS позаботится об этом. Позвольте мне подробно объяснить.

Пожалуйста, рассмотрите эту скрипту

angular.module('mySettings', []).controller('appSettingsCtrl', function ($scope) {

    $scope.timeFormatTemplates = [{
        label: "Seconds",
        value: 'ss'
    }, {
        label: "Minutes",
        value: 'mm'
    }, {
        label: "Hours",
        value: 'hh'
    }];


    $scope.inactivity_settings = {
        status: false,
        inactive_time: 60 * 5 * 3, // 15 min (default value), that is, 900 seconds
        //time_format: 'ss', // Second (default value)
        time_format: $scope.timeFormatTemplates[0], // Default seconds object
    };

    $scope.activity_settings = {
        status: false,
        active_time: 60 * 5 * 3, // 15 min (default value), that is,  900 seconds
        //time_format: 'ss', // Second (default value)
        time_format: $scope.timeFormatTemplates[0], // Default seconds object
    };

    $scope.changedTimeFormat = function (time_format) {
        'use strict';

        console.log('time changed');
        console.log(time_format);
        var newValue = time_format.value;

        // do your update settings stuffs
    }
});

Как вы можете видеть на выходе скрипта, независимо от того, что вы выберете для выбора параметров окна, это ваше пользовательское значение или автоматическое генерируемое значение 0, 1, 2 от AngularJS, это не имеет значения в вашем выводе, если вы не используете jQuery или любую другую библиотеку, чтобы получить доступ к значению этих параметров выбора со списком и соответствующим образом манипулировать им.

3

Через год после вопроса мне пришлось найти ответ на этот вопрос, так как не из них дал реальный ответ, по крайней мере для меня.

Вы спросили, как выбрать этот параметр, но никто не сказал, что эти две вещи: НЕ:

Если у нас есть такие опции:

$scope.options = [
    { label: 'one', value: 1 },
    { label: 'two', value: 2 }
  ];

И мы пытаемся установить параметр по умолчанию следующим образом:

$scope.incorrectlySelected = { label: 'two', value: 2 };

Он будет НЕ работать, но если вы попытаетесь выбрать такой вариант:

$scope.correctlySelected = $scope.options[1];

Он будет РАБОТАТЬ.

Несмотря на то, что эти два объекта имеют одинаковые свойства, AngularJS рассматривает их как РАЗЛИЧНЫЕ, поскольку AngularJS сравнивается с помощью reference.

Взгляните на скрипку http://jsfiddle.net/qWzTb/.

3

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

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

http://plnkr.co/edit/fGq2PM?p=preview

Теперь, чтобы выполнить ng-options, рассмотрим следующие вещи:

  • Обычно вы получаете опции из одного источника и выбранного значения из другого. Например:
    • состояния:: данные для ng-options
    • user.state:: Параметр для установки в качестве выбранного
  • Основываясь на 1, самая простая/логичная задача - заполнить выбор одним источником, а затем установить выбранный код кода. Редко было бы лучше получить смешанный набор данных.
  • Функция AngularJS позволяет выбирать элементы управления более чем key | label. Многие онлайн-примеры ставят объекты как "ключ", и если вам нужна информация из объекта, заданного таким образом, в противном случае используйте конкретное свойство, которое вам нужно в качестве ключа. (ID, CODE и т.д. Как и в примере plckr)
  • Способ установки значения выпадающего меню/выбора зависит от # 3,

    • Если раскрывающийся список является единственным свойством (как и во всех примерах в plunkr), вы просто установите его, например: $scope.dropdownmodel = $scope.user.state;
    • Если вы задаете объект как ключ, вам нужно выполнить петлю через параметры, даже назначение объекта не будет устанавливать элемент как выбранный, так как они будут иметь разные хэш-клавиши, например:

      for (var i = 0, len = $scope.options.length; i < len; i++) {
        if ($scope.options[i].id == savedValue) { // Your own property here:
          console.log('Found target! ');
          $scope.value = $scope.options[i];
          break;
        }
      }
      

Вы можете заменить savedValue для того же свойства в другом объекте, $scope.myObject.myProperty.

  • 0
    спустя годы я благодарю вас за образец плунжера. Очень полезно.
3

Правильный ответ на этот вопрос был предоставлен пользователем frm.adiputra, поскольку в настоящее время это единственный способ явно контролировать атрибут value опции элементы.

Однако я просто хотел подчеркнуть, что "select" не является ключевым словом в этом контексте, но он просто является заполнителем выражения. Пожалуйста, обратитесь к следующему списку для определения выражения "select", а также других выражений, которые могут использоваться в директиве ng-options.

Использование select, как оно изображено в вопросе:

ng-options='select p.text for p  in resultOptions'

по существу является неправильным.

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


Из документации AngularJS для ng-options:

  • массив/объект: выражение, которое оценивает массив/объект для итерация.
  • value: локальная переменная, которая будет ссылаться на каждый элемент в массив или каждое значение свойства объекта во время итерации.
  • ключ: локальная переменная, которая будет ссылаться на имя свойства в объекте во время итерации.
  • label. Результатом этого выражения будет метка для  элемент. Выражение, скорее всего, относится к значению переменная (например, value.propertyName).
  • выберите. Результат этого выражения будет привязан к модели родительского элемента. Если не указано, выражение будет по умолчанию равно значению.
  • группа. Результат этого выражения будет использоваться для группировки опций с помощью DOM элемент.
  • trackexpr. Используется при работе с массивом объектов. Результат этого выражения будет использован для идентификации объектов в массиве. TrackEXpr скорее всего будет ссылаться на (например, value.propertyName).
2

Вы можете использовать ng-options для достижения привязки тега select к значению и элементам отображения

При использовании этого источника данных

countries : [
              {
                 "key": 1,
                 "name": "UAE"
             },
              {
                  "key": 2,
                  "name": "India"
              },
              {
                  "key": 3,
                  "name": "OMAN"
              }
         ]

вы можете использовать ниже, чтобы привязать ваш тег select к значению и имени

<select name="text" ng-model="name" ng-options="c.key as c.name for c in countries"></select>

он отлично работает

  • 1
    Пожалуйста, дополните свой ответ только для кода некоторым объяснением, чтобы избежать ошибочного представления о том, что StackOverflow является бесплатной службой написания кода.
2

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

Попробуйте

<select ng-options="obj.text for obj in array track by obj.value"></select>

который назначит метки с текстом и значением со значением (из массива)

2

Учебник ANGULAR.JS: NG-SELECT AND NG-OPTIONS помог мне решить проблему:

<select id="countryId"
  class="form-control"
  data-ng-model="entity.countryId"
  ng-options="value.dataValue as value.dataText group by value.group for value in countries"></select>
  • 0
    Спасибо за ссылку.
2

Для разработчиков всегда больно использовать ng-options. Например: получение пустого/чистого выбранного значения в теге select. Особенно при работе с объектами JSON в ng-вариантах он становится более утомительным. Здесь я сделал несколько упражнений.

Цель: Итерировать массив объектов JSON через опцию ng и установить выбранный первый элемент.

Данные:

someNames = [{"id":"1", "someName":"xyz"}, {"id":"2", "someName":"abc"}]

В теге select мне нужно было показать xyz и abc, где xyz должен быть выбран без особых усилий.

HTML:

<pre class="default prettyprint prettyprinted" style=""><code>
    &lt;select class="form-control" name="test" style="width:160px"    ng-options="name.someName for name in someNames" ng-model="testModel.test" ng-selected = "testModel.test = testModel.test || someNames[0]"&gt;
&lt;/select&gt;
</code></pre>

В приведенном выше примере кода вы можете выйти из этого преувеличения.

Еще ссылка:

2

Для объекта:

<select ng-model="mySelect" ng-options="key as value for (key, value) in object"></select>
1

Запустите фрагмент кода и просмотрите варианты. Вот замечание для быстрого понимания

  • Пример 1 (Выбор объекта): - ng-option="os.name for os in osList track by os.id". Здесь track by os.id важен, а должен быть, а os.id as должен НЕ иметь os.name.

    • ng-model="my_os" должен установить объект с ключом как id, например my_os={id: 2}.
  • Пример 2 (Выбор значения): - ng-option="os.id as os.name for os in osList". Здесь track by os.id должен быть, а os.id as должен быть до os.name.

    • ng-model="my_os" должен установить значение, подобное my_os= 2

Откроется фрагмент кода восстановления.

angular.module('app', []).controller('ctrl', function($scope, $timeout){
  
  //************ EXAMPLE 1 *******************
  $scope.osList =[
    { id: 1, name :'iOS'},
    { id: 2, name :'Android'},
    { id: 3, name :'Windows'}
  ]
  $scope.my_os = {id: 2};
  
  
  //************ EXAMPLE 2 *******************
  $timeout(function(){
    $scope.siteList = [
          { id: 1, name: 'Google'},
          { id: 2, name: 'Yahoo'},
          { id: 3, name: 'Bing'}
        ];
   }, 1000);
    
    $scope.my_site = 2;
  
    $timeout(function(){
      $scope.my_site = 3;
    }, 2000);
})
fieldset{
  margin-bottom: 40px;
  }
strong{
  color:red;
  }
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.10/angular.min.js"></script>

<div ng-app="app" ng-controller="ctrl">

  <!--//************ EXAMPLE 1 *******************-->
  <fieldset>
    <legend>Example 1 (Set selection as <strong>object</strong>)</legend>
    
    <select ng-model="my_os" ng-options="os.name for os in osList track by os.id">
        <option value="">--Select--</option>
      </select>
    {{my_os}}
    
  </fieldset>
  
  
  <!--//************ EXAMPLE 2 *******************-->
  <fieldset>
    <legend>Example 2 (Set selection as <strong>value</strong>. Simulate ajax)</legend>
      <select ng-model="my_site" ng-options="site.id as site.name for site in siteList">
        <option value="">--Select--</option>
      </select>
      {{my_site}}
  </fieldset>
  
</div>
1
<select ng-model="output">
   <option ng-repeat="(key,val) in dictionary" value="{{key}}">{{val}}</option>
</select>
  • 1
    ngOptions предоставляет некоторые преимущества, такие как уменьшение памяти и увеличение скорости за счет отсутствия создания новой области для каждого повторного экземпляра, см. docs.angularjs.org/api/ng/directive/ngOptions
0

директива ngOptions:

$scope.items = [{name: 'a', age: 20},{ name: 'b', age: 30},{ name: 'c', age: 40}];
  • Case-1) для значения в массиве:

    <div>
        <p>selected item is : {{selectedItem}}</p>
        <p> age of selected item is : {{selectedItem.age}} </p>
        <select ng-model="selectedItem" ng-options="item.name for item in items">
        </select>
    </div>
    

Объяснение вывода (выберите 1-й элемент):

selectedItem = {name: 'a', age: 20}//[по умолчанию выбранный элемент равен значению item]

selectedItem.age = 20

  • Case-2) выберите в качестве метки для значения в массиве:

    <div>
        <p>selected item is : {{selectedItem}}</p>
        <select ng-model="selectedItem" ng-options="item.age as item.name for item in items">
        </select>
    </div>
    

Объяснение вывода (предположим, что выбран один из выбранных элементов): selectedItem = 20//[select part is item.age]

0

Вот как я решаю эту проблему в устаревшем приложении:

В HTML:

ng-options="kitType.name for kitType in vm.kitTypes track by kitType.id" ng-model="vm.itemTypeId"

В JavaScript:

vm.kitTypes = [
    {"id": "1", "name": "Virtual"},
    {"id": "2", "name": "Physical"},
    {"id": "3", "name": "Hybrid"}
];

...

vm.itemTypeId = vm.kitTypes.filter(function(value, index, array){
    return value.id === (vm.itemTypeId || 1);
})[0];

Мой HTML правильно отображает значение параметра.

0

Как и многие предыдущие, если у меня есть данные примерно так:

countries : [
              {
                 "key": 1,
                 "name": "UAE"
             },
              {
                  "key": 2,
                  "name": "India"
              },
              {
                  "key": 3,
                  "name": "OMAN"
              }
         ]

Я бы использовал его как:

<select
    ng-model="selectedCountry"
    ng-options="obj.name for obj  in countries">
</select>

В вашем контроллере вам нужно установить начальное значение, чтобы избавиться от первого пустого элемента:

 $scope.selectedCountry = $scope.countries[0];

 // You need to watch changes to get selected value
 $scope.$watchCollection(function() {
   return $scope.selectedCountry
 }, function(newVal, oldVal) {
     if (newVal === oldVal) {
       console.log("nothing has changed " + $scope.selectedCountry)
     } 
     else {
       console.log('new value ' + $scope.selectedCountry)
     }
 }, true)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню