Группа AngularJSПо заказуПо

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

           <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>

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

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

Я попытался добавить orderBy в ng-repeat, как показано ниже.

      <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, похоже, относятся к упорядочению по элементу, содержащемуся в значении, а не длине фильтра.


person Janbango    schedule 05.07.2016    source источник


Ответы (2)


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

groupBy возвращает объект, а orderBy ожидает массив. Поэтому используйте 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 находится на первом месте, он сортирует, а после этого фильтр groupBy инициализируется без фильтра 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>
person Spidi's Web    schedule 05.07.2016
comment
Спасибо, теперь работает, но мне нужно поменять местами orderBy. Я пробовал :reverse, но, похоже, это не имеет значения. Можно ли использовать reverse с toArray - person Janbango; 05.07.2016
comment
Все в порядке, мне нужно использовать :true, а не :reverse - person Janbango; 05.07.2016
comment
Избегайте двухсторонних привязок, и это улучшит производительность;) - person Spidi's Web; 20.03.2017
comment
откуда берется отфильтрованное?, я не вижу его в коде - person Arash; 29.08.2017

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

<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>
person stibay    schedule 17.03.2017