У меня некоторые проблемы с несколькими разными прямоугольниками.
Проблема №1
Первый - это поле, в котором перечислены физические местоположения, сгруппированные либо "В состоянии", либо "Вне состояния". Я их сгруппировал, и значение и метка заданы так, как я хочу, но я не могу получить сгруппированные опции для сортировки по алфавиту. Я попробовал orderBy: "имя" и другие решения, которые, похоже, работают для всех остальных.
Мой html выглядит так:
<select name="dealer" id="dealer" ng-model="warrantyReg.dealer" ng-options="dealer as dealer.selectLabel group by dealer.for for dealer in dealers track by dealer.selectValue | orderBy:'selectLabel'">
Несколько примеров из моего массива дилеров:
$scope.dealers = [
{selectLabel:"Location A", selectValue:255, for:"In state"},
{selectLabel:"Location C", selectValue:1, for:"In state"},
{selectLabel:"Location B", selectValue:5, for:"In state"},
{selectLabel:"Location Z", selectValue:25, for:"Out of state"},
{selectLabel:"Location X", selectValue:55, for:"Out of state"},
{selectLabel:"Location Y", selectValue:50, for:"Out of state"}
];
(Обратите внимание, что это заглушенная версия объектов, они содержат намного больше информации, чем я здесь показываю.)
Независимо от того, что я делаю, параметры никогда не сортируются с помощью selectLabel. Я также попробовал orderBy: "dealer.selectLabel", и он ничего не делает.
ОБНОВЛЕНИЕ Я забыл упомянуть, что $ scope.dealers строится с помощью углового.forEach() для данных, возвращаемых службой. Я прокручиваю каждый возвращаемый дилер и создаю selectLabel, объединяя ключи имени и местоположения, а затем вставляя это значение в массив $ scope.dealers.
Использование.sort() в $ scope.dealers ничего не делает. Однако, если я использую.sort() для данных, возвращенных из службы, прежде чем передавать их через угловое.forEach(), он сортирует их. Я не уверен, в чем разница, но это, по крайней мере, какое-то решение, и вот что я делаю сейчас.
Проблема №2
Я хочу, чтобы в поле выбора была опция "другой...", которая предоставляет текстовое поле, когда оно выбрано. В этой части у меня есть работа, но я не могу получить параметр "другой..." для отображения в нижней части списка элементов, если я сгруппирую все параметры вместе.
Например, у меня есть этот набор данных:
$scope.refs = [
{name:'Friend'},
{name:'Walk-in'},
{name:'Yellow pages'},
{name:'Field and Stream', type:'Magazines'},
{name:'Parent', type:'Magazines'},
{name:'Guns & Ammo', type:'Magazines'},
{name:'other...'}
];
Используя этот пример, всегда появляется "другое..." между "Желтыми страницами" и заголовком группы "Журналы".
Кроме того, у меня есть другой набор данных, который имеет два набора сгруппированных элементов с опцией "другой...", который не сгруппирован, и отображает опцию "другой..." выше обеих групп.
Есть ли способ разместить только "другое..." в нижней части списка сгруппированными элементами?
ОБНОВЛЕНИЕ Поскольку кажется, что для этого нет решения, я просто сделаю опции static html вместо того, чтобы полагаться на ng-options для их создания. Затем я мог бы включить код в include, если это поле выбора, которое будет использоваться в нескольких местах.
Почему бы не отсортировать значения в контроллере так:
$scope.dealers = [
{selectLabel:"Location B", selectValue:255, for:"In state"},
{selectLabel:"Location C", selectValue:1, for:"In state"},
{selectLabel:"Location A", selectValue:5, for:"In state"},
{selectLabel:"Location Z", selectValue:25, for:"Out of state"},
{selectLabel:"Location X", selectValue:55, for:"Out of state"},
{selectLabel:"Location Y", selectValue:50, for:"Out of state"}
].sort(function(a,b){
return a.selectLabel.localeCompare(b.selectLabel);
});
Кажется, это невозможно. См. Этот ответ.