Я новичок в AngularJS, и я пытаюсь решить одну проблему самым элегантным способом.Как установить значение для модели в AngularJS, используя select с массивом объектов
У меня есть список, который исходит от сервера и используется как источник для select
tag's option
в моей заявке. Давайте предположим, что это список авторов, выглядит следующим образом:
[
{ id: 1, name: 'Mark Twain' },
{ id: 2, name: 'Jack London' },
{ id: 3, name: 'Ernest Hemingway' }
]
Также у меня есть книга модель, которая приходит и сохраняется на сервере. Один из свойств книги - author
, который может быть выбран пользователем от select
выпадающего списка. Когда книга модель сохраняется или выбирается с сервера author
Поле представлено как целое. Вот пример того, как книги модель должна быть сохранена на сервере и как это выглядит, когда неправдоподобное:
{
id: 324,
title: 'Martin Eden',
author: 2
}
книга представлена в Угловой-х $resource
в моем приложении, поэтому всякий раз, когда я хочу, чтобы сохранить книгу модели Я просто вызовите метод сохранения.
Для реализации этой логики я пытался использовать select
с ng-options
директивы, например:
<select ng-options="author as author.name for author in authors track by author.id" ng-model="bookModel.author"></select>
Но проблема такого подхода заключается в том, что, когда я выбираю автора из выпадающего списка значение author
свойства устанавливается до { id: 2, name: 'Jack London' }
, но мне нужно, чтобы это был идентификатор автора.
Вот Fiddle, который иллюстрирует мою проблему. Попробуйте выбрать различные значения в раскрывающемся списке. Ниже вы увидите обновленное значение bookModel.author
. Мне нужно, чтобы он был целым числом автора, а не объектом. Поэтому всякий раз, когда я выбираю Jack London in drop down Мне нужно значение bookModel.author
быть 2
, а не { id: 2, name: 'Jack London' }
. В противном случае мне нужно делать манипуляции с данными всякий раз, когда книга модель приходит от сервера и прежде чем я ее сохраню. Я полагаю, что может быть лучший способ. Может быть, это может быть достигнуто с помощью директивы ng-options
?
Я попытался сделать это таким образом:
<select ng-model="bookModel.author">
<option ng-repeat="author in authors" value="{{author.id}}">{{author.name}}</option>
</select>
Это немного ближе, но этот путь bookModel.author
значение «s будет строкой, а не целое число.
Также я знаю, что могу установить transformRequest
и transformResponse
функции для книги $ resource, которые преобразуют данные в соответствующий формат. Но может быть, есть лучший способ?
Поймите любую помощь!
Это отлично работает, когда я выбираю автора из раскрывающегося списка. Но что, если свойство 'author' уже имеет ценность? Я думал, что в этом случае он должен отображаться как выбранный в раскрывающемся списке, но это не так. Вот [Fiddle] (https://jsfiddle.net/Cake_Seller/55zevgjr/4/). Как вы можете видеть, выбор не выбран. –
Другой парень помог мне решить этот последний вопрос. Все, что мне нужно, - удалить часть 'track by author.id' из директивы ng-options. Вот окончательный [скрипка] (https://jsfiddle.net/Cake_Seller/55zevgjr/7/). Большое спасибо за вашу помощь! –