2017-01-30 7 views
0

У меня есть выбор итерация по коллекции вида:нг-опции: Как можно сортировать по collection.item.itemName

ctrl.countriesList = { 
    'DK': {countryName: 'Denmark', preferredLanguage: 'DA'} 
    'US': {countryName: 'USA', preferredLanguage: 'EN'} 
} 

и итерации по объекту:

ng-options="country as country.countryName for country in $ctrl.countriesList" 

так мое раскрывающееся меню теперь корректно отображает свойство countryName в раскрывающемся списке для каждой страны, но оно по-прежнему сортируется по значению кода ISO (DK, US), которое в моем случае часто будет несовместимо с названиями стран, поэтому сортировка countryNames в выпадающее меню не является алфавитным

Как я могу создать сортировку по имени страны по алфавиту? Заранее спасибо!

+0

Разве это не дубликат: http://stackoverflow.com/questions/12310782/ сортировка-выпадающая-алфавитно-угловая? – Georgy

+1

Возможный дубликат [Сортировка в алфавитном порядке в AngularJS] (http: // stackoverflow.com/questions/12310782/sorting-dropdown-alphabetically-in-angularjs) –

+0

спасибо за ответы, но это не дубликаты этого, поскольку они пытаются сортировать массив, тогда как я пытаюсь сортировать по объекту. Спасибо за ответы в любом случае :) – Kozgal

ответ

0

Вы не можете использовать orderBy фильтр, как вы используете Datasource Object и orderBy фильтр работает для источника данных массива

See this question

Если вы хотите использовать orderBy фильтр внести изменения в источнике данных как упоминалось в других ответах

Если вы хотите пойти с объектами, я бы предложил вам добавить функцию, которая вернет отсортированные значения.

В контроллере:

$scope.ctrl = {//---> Source 
      countriesList : { 
     'DK': {countryName: 'Denmark', preferredLanguage: 'DA'}, 
     'US': {countryName: 'USA', preferredLanguage: 'EN'}, 
     'BEL':{countryName: 'Belgium', preferredLanguage: 'NL'} 
     } 
} 



$scope.getSortedCountryList = function(){ //--> Sort Function 
$scope.sorted = {}; 
Object.keys($scope.ctrl.countriesList) 
     .sort(function(a,b){ 
      if($scope.ctrl.countriesList[a].countryName < $scope.ctrl.countriesList[b].countryName) return -1; 
      if($scope.ctrl.countriesList[a].countryName > $scope.ctrl.countriesList[b].countryName) return 1; 
      return 0; 
     }) 
     .forEach(function(v, i) { 
      $scope.sorted[v] = $scope.ctrl.countriesList[v]; 
     }); 
return $scope.sorted; 
} 

В HTML select

ng-options="country as country.countryName for country in getSortedCountryList()" 

FIDDLE

+0

Итак, я думаю, что сортировать по объектной структуре как моему. Я увижу, могу ли я сортировать структуру, используя что-то вроде вашего предложения, или поочередно изменить всю структуру данных на массив. Отметьте ваш ответ как принято - спасибо! – Kozgal

+0

В итоге я использовал вашу функцию сортировки! Большое спасибо! – Kozgal

+0

Рад помочь !!! :) – Nishant123

-1

Прежде всего перепишите свой набор данных на более простой подход к JSON. Поскольку orderBy не является (а также не будет) реализован для Objects (link)

$scope.countriesList = [ 
     {countryName: 'Denmark', preferredLanguage: 'DA'}, 
     {countryName: 'Belgium', preferredLanguage: 'NL'}, 
     {countryName: 'USA', preferredLanguage: 'EN'} 
    ] 

На уровне представления:

<select ng-options="country.countryName for country in countriesList | orderBy:'countryName':false" ng-model="selected"></select> 

SEE PLUNKR

+0

Если я это сделаю, я потеряю код ISO, например, «DK» для denmark - мне нужно, чтобы это было к сожалению, – Kozgal

-1

использования службы OrderBy в вашем выберите тег

<select ng-options="country as country.countryName for country in ctrl.countriesList | orderBy:'countryName':false" ng-model="country"> 

als о уточним JSon

$scope.ctrl.countriesList = [ 
    {countryName: 'Denmark', preferredLanguage: 'DA'}, 
    {countryName: 'USA', preferredLanguage: 'EN'} 
    ] 

Plunkr

+0

Это будет работать только при обновлении dataModel, а не в использовании Объекты. Пожалуйста, прочтите вопрос правильно. –

+0

пользователь не упомянул, что –

+0

Он формулирует этот литерал в своем вопросе. Он даже показывает объект данных в своем первоначальном вопросе. Ваш ответ неверен. –

-1

Вы также можете отсортировать массив непосредственно в JavaScript.

$scope.countriesList = [ 
     {countryName: 'Denmark', preferredLanguage: 'DA'}, 
     {countryName: 'Belgium', preferredLanguage: 'NL'}, 
     {countryName: 'USA', preferredLanguage: 'EN'} 
    ] 
.sort(function(a, b){ 
    return a.countryName < b.countryName; 
}); 
+0

Ваш массив сопоставляется как формат массива OP? –

+0

Что вы подразумеваете под "OP"? –

+0

OP - оригинальный плакат, но, к сожалению, я не могу использовать массив. Мне нужен объект с ключом ISO в качестве значения для страны. Но спасибо за предложение! – Kozgal