it-swarm.com.de

ngOptions "track by" Ausdruck

Ich versuche, den Ausdruck 'track by' zu verwenden, um Auswahlen nach ID in einem Array von Objekten zu verfolgen. Ich kann es jedoch nicht so machen, wie ich es für richtig halte.

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

Basierend auf der Dokumentation Ich denke, dass die options-Direktive beim Laden sehen würde, dass der serverDTO die 'track by'-IDs 1, 2 und 3 hat und diese vorausgewählt hat. Nachdem der Benutzer die Auswahl geändert hat, müsste ich so etwas tun, um das Array an den Server zurückzugeben.

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

Bin ich weit davon entfernt, wie das funktionieren soll?

26
thebringking

track by hilft nur Angular intern bei der Arraysortierung, soweit ich weiß. Der Wert der Optionen wird durch das erste Argument definiert (in Ihrem Fall item). Wenn Sie möchten es soll nach ID sein, dann solltest du item.id as item.name for item in items

39
jraede

"track by" ist nützlich, wenn Sie in ng-options ein Array von Objekten und ein Modell verwenden, das Sie ebenfalls verwenden. Sie möchten jedoch keine Verfolgungsoptionen anhand der Referenz des Objekts im Modell. Mit "Verfolgen nach" zeigen Sie, dass Sie die Optionen nach dem gewünschten Modellfeld verfolgen.

in deinem Fall mit "track by" muss $ scope.serverDTO wie folgt lauten: {id: 1, name: "test"}

7