27

我正在尝试使用“track by”表达式在对象数组中按 id 跟踪选择。但是,我似乎无法让它像我认为的那样工作。

//ids from server
$scope.serverDTO = ['1','2','3'];

//composed objects from the ID set
$scope.composedData = [{id:1,name:"test"},{id:2,name:"test"},{id:3,name:"test"}];

<!-- select box -->
<select ng-model="serverDTO" ng-options="item as item.name for item in composedData track by item.id"></select>

因此,根据文档,我认为关于加载的选项指令会看到 serverDTO 具有 1、2 和 3 的“track by”ID,并预先选择了这些。在用户修改选择后,我需要做这样的事情来将数组返回到服务器 -

//recreate proper DTO [1,2,3];
$scope.serverDTO = $scope.serverDTO.map(function(val){
  return val.id;
});

我对这应该如何工作还有很长的路要走吗?

4

2 回答 2

41

track by据我所知,只是在内部帮助 Angular 进行数组排序。选项的值由第一个参数定义(在您的情况下item)。如果你希望它是 id 那么你应该使用item.id as item.name for item in items

于 2014-04-30T20:23:50.230 回答
7

当在对象和模型的 ng-options 数组中也使用对象时,“track by”很有用。但是您不希望通过模型中对象的引用来跟踪选项。使用“跟踪依据”,您指出您通过模型的所需字段跟踪选项。

在您使用“track by”的情况下,$scope.serverDTO 必须类似于 {id:1,name:"test"}

于 2015-05-27T15:28:34.613 回答