私は AngularJS を初めて使用し、最もエレガントな方法で 1 つの問題を解決しようとしています。
select
サーバーから取得され、アプリケーションでタグのソースとして使用されるリストがありoption
ます。次のような著者のリストであると仮定しましょう。
[
{ id: 1, name: 'Mark Twain' },
{ id: 2, name: 'Jack London' },
{ id: 3, name: 'Ernest Hemingway' }
]
また、サーバーから取得して保存したブックモデルもあります。本のプロパティの 1 つはauthor
、ユーザーがドロップダウンから選択できるものselect
です。書籍モデルがサーバーから保存または取得されると、そのフィールドauthor
は整数として表されます。本のモデルをサーバーに保存する方法と、取得したときの外観の例を次に示します。
{
id: 324,
title: 'Martin Eden',
author: 2
}
bookは私のアプリケーションでは Angular のものとして表され$resource
ているので、book モデルを保存したいときはいつでも save メソッドを呼び出すだけです。
このロジックを実装するために、次のよう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' }
ますが、作成者の ID である必要があることです。
ここに私の問題を説明するフィドルがあります。ドロップダウンで別の値を選択してみてください。ドロップダウンの下に、 の更新された値が表示されますbookModel.author
。オブジェクトではなく、著者のID整数である必要があります。したがって、ドロップダウンでJack LondonbookModel.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
の値は整数ではなく文字列になります。
また、データを適切な形式に変換する book $resource を設定transformRequest
して機能できることも知っています。transformResponse
しかし、もっと良い方法があるのではないでしょうか?
どんな助けにも感謝します!