web-dev-qa-db-fra.com

ngOptions expression "track by"

J'essaie d'utiliser l'expression "suivre par" pour suivre les sélections par identifiant, dans un tableau d'objets. Cependant, je n'arrive pas à le faire fonctionner comme je pense que cela fonctionne.

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

Donc, sur la base de la documentation je pensais que la directive options sur load verrait que le serverDTO a les identifiants 'track by' de 1, 2 et 3, et les a présélectionnés. Une fois que l'utilisateur a modifié la sélection, je devrais faire quelque chose comme ça pour retourner le tableau au serveur -

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

Suis-je loin de savoir comment cela est censé fonctionner?

26
thebringking

track by aide simplement Angular en interne avec le tri de tableau pour autant que je sache. La valeur des options est définie par le premier argument (dans votre cas item). Si vous voulez que ce soit par id, vous devez utiliser item.id as item.name for item in items

39
jraede

"track by" est utile lorsque dans le tableau d'objets et le modèle ng-options, vous utilisez également l'objet. mais vous ne voulez pas d'options de suivi par la référence de l'objet dans le modèle. En utilisant "suivre par", vous indiquez que vous suivez les options par champ de modèle souhaité.

dans votre cas avec "track by" $ scope.serverDTO doit être comme {id: 1, name: "test"}

7
Vasiliy Mazhekin