web-dev-qa-db-ja.com

ngOptionsの「追跡方法」式

オブジェクトの配列で、「追跡方法」式を使用して、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>

documentation Iに基づいていますが、ロード時のoptionsディレクティブでは、serverDTOの 'track by' IDが1、2、および3であり、それらが事前に選択されていることがわかります。ユーザーが選択を変更した後、配列をサーバーに返すためにこのようなことをする必要があります-

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

これがどのように機能することになっているのでしょうか?

26
thebringking

track byは、Angular私が知る限り、内部的に配列ソートを使用します。オプションの値は、最初の引数(あなたの場合はitem)によって定義されます。 IDを使用する場合は、item.id as item.name for item in itemsを使用する必要があります

39
jraede

「track by」は、ng-optionsのオブジェクトの配列およびモデルでオブジェクトも使用する場合に役立ちます。ただし、モデル内のオブジェクトの参照による追跡オプションは必要ありません。 「追跡」を使用すると、モデルの目的のフィールドでオプションを追跡することを指します。

「track by」の場合、$ scope.serverDTOは{id:1、name: "test"}のようにする必要があります

7