我在 Angular 的选择指令中设置所选项目时遇到问题。我不知道这是 Angular 设计师的错误还是有意识的设计。它确实使 select 指令变得不那么有用了。
描述:
我的应用程序与 REST API 通信以从数据库接收实体。API 规定对象的关系仅使用 ID 属性发送,以便您可以在需要时在后续请求中检索它们。
例子:
{ id : 1, customerName : "some name", city : {id : 12}}
其中 city 是另一个实体,可以使用城市 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 的选择小部件?