2016-07-05 4 views
1

Использование angular.filter я использую GroupBy и длину, чтобы дать мне подсчет количества записей, регистрируемых пользователем EMAILIDAngularJS группеПо OrderBy

  <div ng-repeat="(key, value) in leaderboard | groupBy: 'emailId'"> 
       <h3>{{ key }} {{ filteredList.length}}</h3> 
       <li ng-repeat="leaderboard in value | filter: emailId as filteredList"></li> 
      </div> 

Это все работает отлично давая мне список emailIds, в количество записей для каждого emailId и записи, перечисленные ниже.

Что я пытаюсь сделать, так это упорядочить данные по количеству записей для каждого emailId (другими словами, упорядочить данные по значению, возвращаемому {{filterList.length}}).

Я попытался добавить OrderBy к нг-повтора, как показано ниже

 <div ng-repeat="(key, value) in leaderboard | groupBy: 'emailId' | orderBy: filtered.length"> 
      <h3>{{ key }} {{ filteredList.length}}</h3> 
      <li ng-repeat="leaderboard in value | filter: emailId as filteredList"></li> 
     </div> 

, но это не имеет никакого значения в порядке элементы перечислены. Я искал существующий ответ, но все orderBy, не работающие с groupBy, похоже, относятся к упорядочению по элементу, содержащемуся в значении, а не по длине фильтра.

ответ

0

группа пользователей углового фильтра написал, что должно быть сделано в ссылке ниже: https://github.com/a8m/angular-filter/issues/57#issuecomment-65041792

groupBy возвращает объект, но orderBy fiter ожидает, что массив. Поэтому используйте toArray: true и дайте orderBy массив для работы.

Ниже приведен код, который должен работать:

<div ng-repeat="(key, value) in leaderboard | groupBy: 'emailId' | toArray: true |orderBy: filtered.length"> 
     <h3>{{ key }} {{ filteredList.length}}</h3> 
     <li ng-repeat="leaderboard in value | filter: emailId as filteredList"></li> 
    </div> 

Кроме того, имейте в виду, что OrderBy должен быть последним фильтром в цепочки.

Редактировать

Вы также можете переключить места OrderBy и GroupBy. Если OrderBy фильтр в первую очередь сортирует и после этого группеПо фильтр инициализируется без ToArray фильтра

Пример:

<div ng-repeat="(key, value) in array | orderBy: filtered.length | groupBy: 'emailId'"> 
      <h3>{{ key }} {{ filteredList.length}}</h3> 
      <li ng-repeat="leaderboard in value | filter: emailId as filteredList"></li> 
     </div> 
+0

Спасибо, теперь работаю, но мне нужно отменить 'orderBy'. Я попробовал ': reverse', но, похоже, это не имеет значения. Может ли 'reverse' использоваться с' toArray' – Janbango

+0

Его хорошо, мне нужно использовать ': true', а не': reverse' – Janbango

+0

Вы получили это право;) –

0

Это можно легко исправить, просто заказав первым, то группировка. Гораздо лучше производительность.

<div ng-repeat="(key, value) in leaderboard | orderBy: filtered.length" | groupBy: 'emailId'> 
    <h3>{{ key }} {{ filteredList.length}}</h3> 
    <li ng-repeat="leaderboard in value | filter: emailId as filteredList"></li> 
</div>