angular の select ディレクティブで選択した項目を設定する際に問題があります。これがバグなのか、angular の設計者による意識的な設計なのかはわかりません。ただし、selectディレクティブの有用性が大幅に低下することは確かです。
説明:
私のアプリは REST API と通信して、データベースからエンティティを受け取ります。API は、必要に応じて後続のリクエストでそれらを取得できるように、オブジェクトの関係が ID プロパティのみで送信されることを指示します。
例:
{ id : 1, customerName : "some name", city : {id : 12}}
ここで、都市は、都市 ID を使用して別の REST エンドポイントから取得できる別のエンティティであり、次のようになります。
{ id: 12, name : "New York"}
ユーザーがリストから適切な都市を選択できるように、可能なすべての都市を含むドロップダウン メニューを使用して顧客エンティティを編集するフォームを作成する必要があります。リストには、JSON オブジェクトから取得した顧客の市区町村が最初に表示されている必要があります。
フォームは次のようになります。
<form>
<input type="text" ng-model="customer.name"/>
<select ng-model="customer.city" ng-options="i as i.name for i in cities"></select>
</form>
コントローラーは次のようになります。
app.controller('MainCtrl', function ($scope, $http) {
$http.get(serviceurl + 'admin/rest/customer/' + id + "/", {
params: {"accept": "json"},
withCredentials: true
}).then(function (response) {
$scope.customer = response.data.item;
});
$http.get(serviceurl + 'admin/rest/city/', {
params: {"accept": "json"},
withCredentials: true
}).then(function (response) {
$scope.cities = response.data.items;
// THIS LINE LOADS THE ACTUAL DATA FROM JSON
$scope.customer.city = $scope.findCity($scope.customer.city);
});
$scope.findCity = function (city) {
for (var i = 0; i < $scope.cities.length; i++) {
if ($scope.cities[i].id == city.id) {
return $scope.cities[i];
}
}
}
});
何が起こるべきか: City オブジェクトの完全な詳細が読み込まれると、select ディレクティブは、リスト内の選択された項目として読み込まれた都市を設定する必要があります。
何が起こるか: リストには空のアイテムが表示され、選択されたアイテムがアイテムの配列外のオブジェクトから選択された場合、選択されたアイテムを初期化する方法がありません。
ここの問題のデモ: http://plnkr.co/edit/NavukDb34mjjnQOP4HE9?p=preview
これに対する解決策はありますか?AJAX 呼び出しと選択ロジックが再利用可能な AJAX ベースの選択ウィジェットにリファクタリングされるように、選択された項目を一般的な方法でプログラムで設定できますか?