<select>
この質問は、 ng-options を使用したタグでの選択に関する問題と非常によく似ていると言うことから始めましょう。たとえば、AngularJS の ng-options を使用して select を操作します。特定の問題は、オブジェクトの 2 つの異なるインスタンスを比較することです。これらは参照が等しくありませんが、論理的には同じデータを表しています。
実証するために、モデル内に次のオプションの配列と選択されたオプション変数があるとします。
$scope.items = [
{ID: 1, Label: 'Foo', Extra: 17},
{ID: 2, Label: 'Bar', Extra: 18},
{ID: 3, Label: 'Baz', Extra: 19}
];
$scope.selectedItem = {ID: 1, Label: 'Foo'};
上記のオブジェクトはデモ用であることに注意してください。selectedItem
モデルオブジェクトの特定のプロパティが異なる場合があることを示すために、特に「追加」プロパティをオフにしました。重要なことは、ID プロパティで比較したいということです。equals()
プロトタイプ「クラス」とIDの両方を比較する実際のオブジェクトの関数があります。
そして、ビューで:
<label class="radio inline" ng-repeat="item in items">
<input type="radio" ng-model="selectedItem" ng-value="item"> {{item.Label}}
</label>
ここでの問題は、angular がオブジェクトの参照等価性を使用しているため、'Foo' のラジオ ボタンが選択されないことです。スコープの最後の行を以下に変更すると、すべてが期待どおりに機能します。
$scope.selectedItem = items[0];
しかし、私が抱えている問題は、私のアプリケーションでは、これら 2 つの単純な変数をスコープ内で単純に宣言していないことです。むしろ、オプション リストと、選択されたオプションがバインドされているデータ構造は、両方とも $http を使用してサーバーからクエリされる JSON データの大きなセットの一部です。一般的なケースでは、データ バインドされた選択されたプロパティを、データ クエリから同等のオプションに変更することは非常に困難です。
それで、私の質問: の ng-options では<select>
、angular は、track by
「object.ID」のようなものを言うことができる式を提供し、選択したモデル値を ID プロパティを介してオプションと比較する必要があることを angular に通知します。すべてが同じモデル プロパティにバインドされている一連の無線入力に使用できる同様のものはありますか? 理想的には、オブジェクト タイプと ID の両方をチェックする、これらのモデル オブジェクトに配置した独自のカスタム equals() メソッドを使用するように angular に指示できます。それができない場合は、ID 比較を指定できるようにすることもできます。