ngOptions "track by" expression
Asked Answered
T

2

29

I am trying to use the 'track by' expression to track selections by id, in an array of objects. However, I can't seem to make it work like I think it works.

//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>

So based on the documentation I though that the options directive on load would see that the serverDTO has the 'track by' ids of 1, 2, and 3, and have those pre-selected. After the user modifies the selection I would need to do something like this to return the array to the server-

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

Am I way off on how this is supposed to work?

Tetrahedral answered 30/4, 2014 at 20:21 Comment(1)
ng-options="item as item.name for item in composedData track by item.id"> <--- worked like a charm for me, thank youEthel
W
42

track by just helps Angular internally with array sorting as far as I know. The value of the options is defined by the first argument (in your case item). If you want it to be by id then you should use item.id as item.name for item in items

Watercourse answered 30/4, 2014 at 20:23 Comment(0)
S
7

"track by" is usefull when in ng-options array of objects and model you use object also. but you do not want track options by the reference of the object in model. Using "track by" you point that you track options by desired field of model.

in your case with "track by" $scope.serverDTO must be like {id:1,name:"test"}

Salbu answered 27/5, 2015 at 15:28 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.