Позвольте мне начать с того, что этот вопрос очень похож на проблемы с выбором в теге <select>
, используя ng-options. Например, Работа с выбором с помощью ng-опций AngularJS. Конкретной проблемой является сравнение двух разных экземпляров объекта, которые не являются ссылочными, но которые логически представляют одни и те же данные.
Чтобы продемонстрировать, скажем, у нас есть следующий массив параметров и выбранная переменная опции в модели:
$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'};
Обратите внимание, что указанные объекты предназначены только для демонстрации. Я специально отказался от свойства "Extra" на selectedItem
, чтобы показать, что иногда мои объекты модели отличаются своими специфическими свойствами. Важно то, что я хочу сравнить свойство ID. У меня есть функция equals()
на моих реальных объектах, которая сравнивает как прототип 'class', так и ID.
И затем в представлении:
<label class="radio inline" ng-repeat="item in items">
<input type="radio" ng-model="selectedItem" ng-value="item"> {{item.Label}}
</label>
Теперь проблема заключается в том, что переключатель "Foo" не будет запущен, потому что angular использует ссылочное равенство для объектов. Если бы я изменил последнюю строку в своей области на ниже, все будет работать так, как ожидалось.
$scope.selectedItem = items[0];
Но проблема у меня в том, что в моем приложении я не просто объявляю эти две простые переменные в области видимости. Скорее, список опций и структура данных, в которых привязан выбранный параметр, являются частью более крупных наборов данных JSON, которые запрашиваются с сервера с помощью $http. В общем случае для меня очень сложно перейти на выбранное свойство привязки данных к эквивалентной опции из моего запроса данных.
Итак, мой вопрос:
В ng-опциях для <select>
, angular предлагает выражение track by
, которое позволяет мне сказать что-то вроде "object.ID" и сообщить angular, что он должен сравнивать выбранное значение модели с параметрами с помощью идентификатора имущество. Есть ли что-то подобное, что я могу использовать для множества радиовходов, связанных с одним и тем же свойством модели? В идеале я мог бы сказать angular использовать мой собственный метод equals(), который я разместил на этих объектах модели, который проверяет как тип объекта, так и идентификатор. Если это не удастся, возможно, также будет иметь возможность указывать сопоставление идентификаторов.