В чем разница между следующими двумя фрагментами при попытке orderBy через функцию:

<li ng-repeat="str in arrOfStrings | orderBy: 'toString()'> {{str}} </li>

А также

<li ng-repeat="person in people | orderBy: getSortKey()> {{person.firstName}} {{person.lastName}}: {{person.email}} </li>
$scope.getSortKey = function() {
    return "lastName";
}

Также мне интересно, как метод toString () помогает при сортировке массива строк. См. Как заставить фильтр orderby работать с массивом строк?

1
Anup Vasudeva 14 Дек 2013 в 11:23

1 ответ

Лучший ответ

В первом случае вы говорите использовать свойство или метод элементов в массиве

Во втором случае вы говорите использовать метод или свойство из глобальной (фактически текущей) области, которая должна возвращать то, что будет применено к элементам массива, т.е. оно будет выполнено первым, и поэтому ваш второй пример можно упростить до

 <li ng-repeat="person in people | orderBy: 'lastName'>

Примером типичного использования второго случая может быть сортировка в таблице. У вас может получиться что-то вроде этого:

 <table>
   <tr><td ng-click='sortColumn="a"'>a<td><td ng-click='sortColumn="b"'></td>
   </tr>
   <tr ng-repeat="e in elements | orderBy: sortColumn"><td>{{ a }}</td><td>{{ b }}</td></tr>
 </table>

Чтобы быть более точным - orderBy принимает либо строку как параметр, либо функцию, которая возвращает строку. Строка должна быть именем свойства или вызова метода для элемента массива.

4
vittore 14 Дек 2013 в 11:45
Спасибо за объяснение. Поправьте меня, если я ошибаюсь: в первом случае orderBy: 'toString ()' сначала преобразует массив в строку, разделенную запятыми, а затем отсортирует их. Правильно?
 – 
Anup Vasudeva
14 Дек 2013 в 11:41
Нет. в первом случае массив будет отсортирован по значениям str.toString(), т.е. вызов .toString() для каждого элемента массива.
 – 
vittore
14 Дек 2013 в 11:47