Вот то, что, кажется, беспокоит многих людей (включая меня).
При использовании ng-options
директивы в AngularJS, чтобы заполнить опции для<select>
тега я не могу понять, как установить значение для параметра. Документация для этого действительно неясна - по крайней мере, для простого человека, как я.
Я могу установить текст для опции легко так:
ng-options="select p.text for p in resultOptions"
Когда, resultOptions
например:
[
{
"value": 1,
"text": "1st"
},
{
"value": 2,
"text": "2nd"
}
]
Должно быть (и, вероятно, так и есть) самая простая вещь для установки значений параметров, но пока я просто не понимаю.
javascript
angularjs
Юкка Пуранен
источник
источник
Ответы:
В вашем случае это должно быть
Обновить
Благодаря обновлениям AngularJS теперь можно установить фактическое значение для
value
атрибутаselect
элемента сtrack by
выражением.Как запомнить этот ужасный материал
Всем людям, которым трудно запомнить эту синтаксическую форму: я согласен, что это не самый простой и красивый синтаксис. Этот синтаксис является своего рода расширенной версией понимания списков Python и знания, которые помогают мне очень легко запомнить синтаксис. Это что-то вроде этого:
Код Python:
На самом деле это тот же синтаксис, что и первый, перечисленный выше. Однако
<select>
обычно нам необходимо различать фактическое значение в коде и текст, отображаемый (метка) в<select>
элементе.Мол, нам нужно
person.id
в коде, но мы не хотим показыватьid
его пользователю; мы хотим показать его имя. Кроме того, мы не заинтересованыperson.name
в коде. Приходитas
ключевое слово для обозначения вещей. Так и получается так:Или вместо
person.id
нас может понадобиться самperson
экземпляр / ссылка. См. ниже:Для объектов JavaScript применяется тот же метод. Просто помните, что предметы в объекте деконструированы
(key, value)
парами.источник
Как атрибуты значения получают свое значение:
Так что в вашем случае это должно быть:
источник
У меня тоже была эта проблема. Я не смог установить свое значение в ng-options. Каждая сгенерированная опция была установлена с 0, 1, ..., n.
Чтобы сделать это правильно, я сделал что-то подобное в моих параметрах ng:
HTML:
Я использую «Track by», чтобы установить все мои значения с
room.price
.(Этот пример - отстой: потому что если бы было более одной равной цены, код не работал бы. Поэтому ОБЯЗАТЕЛЬНО имейте разные значения.)
JSON:
Я узнал об этом из сообщения в блоге. Как установить начальное выбранное значение элемента select с помощью Angular.JS ng-options & track by .
Смотреть видео. Это хороший класс :)
источник
Если вы хотите изменить значение ваших
option
элементов, потому что форма будет в конечном итоге отправлена на сервер, вместо этого,Ты можешь сделать это:
Ожидаемое значение будет отправлено через форму под правильным именем.
источник
<input type="hidden" name="text" value="{{ text }}" />
я бы использовалng-value
. Итак:<input type="hidden" name="text" ng-value="{{ text }}" />
.Чтобы отправить пользовательское значение, вызываемое
my_hero
на сервер, используя обычную форму отправки:JSON:
HTML:
Сервер получит либо
iron
илиsuper
как значениеmy_hero
.Это похоже на ответ @neemzy , но с указанием отдельных данных для
value
атрибута.источник
Кажется, что
ng-options
это сложно (возможно, расстраивает), но в действительности у нас есть проблемы с архитектурой.AngularJS служит средой MVC для динамического приложения HTML + JavaScript. Хотя его (V) iew-компонент действительно предлагает HTML-шаблонизацию, его основная цель состоит в том, чтобы связать действия пользователя через контроллер с изменениями в модели. Следовательно, соответствующий уровень абстракции, с которой можно работать в AngularJS, заключается в том, что элемент select устанавливает значение в модели в значение из запроса .
ng-options
предоставляетfor
ключевое слово, чтобы определить, каким должно быть содержимое элемента option, т.е.p.text for p in resultOptions
.ng-options
предоставляетas
ключевое слово, чтобы указать, какое значение предоставляется модели, как вk as v for (k,v) in objects
.Правильное решение этой проблемы является архитектурным по своей природе и включает в себя рефакторинг вашего HTML, чтобы (M) odel осуществлял связь с сервером при необходимости (вместо пользователя, отправляющего форму).
Если HTML-страница MVC не требует чрезмерного проектирования для рассматриваемой проблемы: используйте только часть генерации HTML компонента AngularJS (V) iew. В этом случае следуйте тому же шаблону, который используется для генерации элементов, таких как
<li />
'under<ul />
', и поместите ng-repeat в элемент option:В качестве kludge всегда можно переместить атрибут name элемента select в скрытый элемент ввода:
источник
"Note: ngOptions provides an iterator facility for the <option> element which should be used instead of ngRepeat when you want the select model to be bound to a non-string value. This is because an option element can only be bound to string values at present."
, Там нет упоминания о производительности, просто ngOptions является альтернативой ngRepeat.Ты можешь сделать это:
-- ОБНОВИТЬ
После некоторых обновлений, пользователь frm.adiputra решение «s намного лучше. Код:
источник
Я боролся с этой проблемой некоторое время сегодня. Я прочитал документацию AngularJS, этот и другие посты и несколько блогов, к которым они ведут. Все они помогли мне найти более мелкие детали, но, в конце концов, это просто запутанная тема. Главным образом из-за множества синтаксических нюансов
ng-options
.В конце концов, для меня все сводилось к меньшему - больше.
Учитывая область настроена следующим образом:
Это все, что мне нужно, чтобы получить желаемый результат:
Обратите внимание, я не использовал
track by
. Использованиеtrack by
выбранного элемента всегда вернет объект, который соответствует FirmnessID, а не сам FirmnessID. Теперь это соответствует моим критериям, заключающимся в том, что он должен возвращать числовое значение, а не объект, и использовать егоng-options
для повышения производительности, которое он обеспечивает, не создавая новую область для каждой сгенерированной опции.Кроме того , я нуждался в пустую первую строку, так что я просто добавил
<option>
к<select>
элементу.Вот Plunkr, который показывает мою работу.
источник
Вместо использования новой функции track by вы можете просто сделать это с массивом, если хотите, чтобы значения были такими же, как у текста:
Обратите внимание на разницу между стандартным синтаксисом, который сделает значения ключами Object / Array и, следовательно, 0,1,2 и т. Д. Для массива:
k как v становится v как v .
Я обнаружил это только на основе здравого смысла, глядя на синтаксис. (k, v) - это фактический оператор, который разбивает массив / объект на пары ключ-значение.
В выражении «k as v» k будет значением, а v будет текстовой опцией, отображаемой для пользователя. Я думаю, что «отслеживать» грязно и излишне.
источник
По моему мнению, это лучше всего подходит для всех сценариев:
где вы можете использовать свою модель для привязки данных. Вы получите значение, которое будет содержать объект, и выбор по умолчанию на основе вашего сценария.
источник
Вот как я решил это. Я отслеживал выбор по значению и устанавливал свойство выбранного элемента для модели в своем коде JavaScript.
vm
мой контроллер, а Страна в контроллере, извлеченная из службы{CountryId =1, Code = 'USA', CountryName='United States of America'}
.Когда я выбрал другую страну из выпадающего списка и разместил свою страницу с надписью «Сохранить», я получил правильную привязку к стране.
источник
ng-options
Директива не устанавливает атрибут значения на<options>
элементах массивов:Используя
limit.value as limit.text for limit in limits
средства:См. Вопрос переполнения стека AngularJS ng-options, не отображающий значения .
источник
источник
Вы можете использовать ng-options для привязки тега select к значению и отображения членов
При использовании этого источника данных
Вы можете использовать ниже, чтобы привязать ваш тег выбора к значению и имени
это прекрасно работает
источник
Правильный ответ на этот вопрос был предоставлен пользователем frm.adiputra , поскольку в настоящее время это, кажется, единственный способ явно контролировать атрибут value элементов option.
Тем не менее, я просто хотел подчеркнуть, что «select» не является ключевым словом в этом контексте, но это просто заполнитель для выражения. Пожалуйста, обратитесь к следующему списку для определения выражения "select", а также других выражений, которые могут использоваться в директиве ng-options.
Использование select, как это изображено в вопросе:
по сути неправильно.
Исходя из списка выражений, кажется, что trackexpr может использоваться для указания значения, когда параметры задаются в массиве объектов, но оно используется только для группировки.
Из документации AngularJS для ng-options:
источник
Выбор элемента в ng-options может быть немного сложным в зависимости от того, как вы настроили источник данных.
Поработав с ними некоторое время, я сделал выборку с наиболее распространенными источниками данных, которые я использую. Вы можете найти это здесь:
http://plnkr.co/edit/fGq2PM?p=preview
Теперь, чтобы заставить работать ng-опции, вот несколько вещей, которые нужно учитывать:
key | label
. Многие онлайн-примеры помещают объекты в качестве «ключа», и если вам нужна информация от объекта, установите ее таким образом, в противном случае используйте конкретное свойство, которое вам нужно, в качестве ключа. (ID, код и т. Д. Как в примере с plckr)Способ установки значения раскрывающегося / выбранного элемента управления зависит от # 3,
$scope.dropdownmodel = $scope.user.state;
Если вы устанавливаете объект в качестве ключа, вам необходимо выполнить циклическое переключение параметров, даже назначение объекта не установит выбранный элемент, так как они будут иметь разные хэш-клавиши, например:
Вы можете заменить saveValue для того же свойства в другом объекте
$scope.myObject.myProperty
.источник
Для меня ответ Бруно Гомеса - лучший ответ.
Но на самом деле вам не нужно беспокоиться о настройке свойства value опций select. AngularJS позаботится об этом. Позвольте мне объяснить подробно.
Пожалуйста, рассмотрите эту скрипку
Как вы можете видеть в выводе скрипта, что бы вы ни выбрали для опций окна выбора, это ваше пользовательское значение или автоматически сгенерированное AngularJS значение 0, 1, 2, оно не имеет значения в ваших выходных данных, если вы не используете jQuery или какой-либо другой другая библиотека, чтобы получить доступ к значению этих параметров поля со списком и манипулировать им соответственно.
источник
Через год после вопроса мне нужно было найти ответ на этот вопрос, поскольку ни один из них не дал фактического ответа, по крайней мере, мне.
Вы спросили , как выбрать вариант, но никто не сказал , что эти две вещи НЕ одинаковы:
Если у нас есть варианты, подобные этой:
И мы пытаемся установить опцию по умолчанию следующим образом:
Это НЕ будет работать, но если вы попытаетесь выбрать опцию, как это:
Это будет РАБОТАТЬ .
Несмотря на то, что эти два объекта имеют одинаковые свойства, AngularJS рассматривает их как РАЗНЫЕ, потому что AngularJS сравнивает по ссылке .
Взгляните на скрипку http://jsfiddle.net/qWzTb/ .
источник
Пожалуйста, используйте трек по свойствам, которые различают значения и метки в поле выбора.
Пожалуйста, попробуй
который назначит метки с текстом и значение со значением (из массива)
источник
Для объекта:
источник
Разработчикам всегда больно работать с ng-options. Например: получение пустого / пустого выбранного значения в теге выбора. Особенно когда имеешь дело с объектами JSON в ng-options, это становится более утомительным. Здесь я сделал несколько упражнений на это.
Цель: перебрать массив объектов JSON с помощью ng-option и установить выбранный первый элемент.
Данные:
В теге select мне пришлось показать xyz и abc, где xyz должен быть выбран без особых усилий.
HTML:
Приведенным выше примером кода вы можете выйти из этого преувеличения.
Еще одна ссылка :
источник
Учебник ANGULAR.JS: NG-SELECT и NG-OPTIONS помог мне решить проблему:
источник
источник
Запустите фрагмент кода и посмотрите варианты. Вот примечание для быстрого понимания
Пример 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"
Следует установить на объект с ключом в качестве идентификатора типа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
Фрагмент кода остатка объяснит.
Показать фрагмент кода
источник
Как многие говорили ранее, если у меня есть данные примерно так:
Я бы использовал это как:
В вашем контроллере вам нужно установить начальное значение, чтобы избавиться от первого пустого элемента:
источник
Вот как я решаю эту проблему в устаревшем приложении:
В HTML:
В JavaScript:
...
Мой HTML отображает значение параметра правильно.
источник
Директива ngOptions:
Case-1) метка для значения в массиве:
Вывод Объяснение (Предположим, выбран 1-й элемент):
selectedItem = {name: 'a', age: 20} // [по умолчанию выбранный элемент равен элементу value ]
selectedItem.age = 20
Случай 2) выберите в качестве метки для значения в массиве:
Вывод Объяснение (Предположим, выбран 1-й элемент): selectedItem = 20 // [выберите элемент item.age ]
источник