Подтвердить что ты не робот

NgOptions выражение "track by"

Я пытаюсь использовать выражение '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>

Итак, основываясь на документации, я уверен, что директива options при загрузке увидит, что serverDTO имеет идентификатор 'track by' от 1, 2 и 3, и имеют те, которые были предварительно выбраны. После того, как пользователь изменит выбор, мне нужно будет сделать что-то вроде этого, чтобы вернуть массив на сервер -

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

Неужели я не знаю, как это должно работать?

4b9b3361

Ответ 1

track by просто помогает Angular внутренне с сортировкой массива, насколько я знаю. Значение опций определяется первым аргументом (в вашем случае item). Если вы хотите, чтобы это было по id, вы должны использовать item.id as item.name for item in items

Ответ 2

"track by" полезно, когда в массиве объектов ng-options и модели вы также используете объект. но вам не нужны параметры трека по ссылке объекта в модели. Используя "track by" , вы указываете, что вы отслеживаете параметры по желаемому полю модели.

в вашем случае с "track by" $scope.serverDTO должно быть как {id: 1, name: "test" }