Группировать массив объектов в Angular Material с помощью * ngFor - PullRequest
0 голосов
/ 02 сентября 2018

Аналогично этот связанный вопрос , Я хочу сгруппировать массив объектов , e.g., by team name

[
 {name: 'Gene', team: 'team alpha'},
 {name: 'George', team: 'team beta'},
 {name: 'Steve', team: 'team gamma'},
 {name: 'Paula', team: 'team beta'},
 {name: 'Scruath of the 5th sector', team: 'team gamma'}
];

К сожалению, принятый ответ с использованием ng-repeat с фильтром groupBy, похоже, не работает в панели расширения Angular Material, что я и пытаюсь сделать: Мне нужно несколько панелей расширения, по одной на команду, которые при расширении показывают участвующих игроков.

Я пытался

<mat-expansion-panel ng-repeat="(key, value) in players | groupBy: 'team'">
    <mat-expansion-panel-header>
      <mat-panel-title>{{ key }}</mat-panel-title>
    </mat-expansion-panel-header>
    <li ng-repeat="player in value">
      {{player.name}}
    </li>
</mat-expansion-panel>

Однако, ng-repeat не разрешен внутри mat-expansion-panel. *ngFor разрешено, но я не знаю, как использовать его с фильтром groupBy. *ngFor="let player in players | groupBy: 'team'" выдает ошибку, и я не могу найти документацию.

1 Ответ

0 голосов
/ 02 сентября 2018

Вы должны сделать свой собственный custom pipe для поддержки GroupBy, также ng-repeat является синтаксисом angularjs, вы должны использовать ngFor.

Ваш пользовательский канал должен выглядеть так:

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({name: 'groupBy'})
export class GroupByPipe implements PipeTransform {
    transform(collection: Array<any>, property: string): Array<any> {
         if(!collection) {
            return null;
        }

        const groupedCollection = collection.reduce((previous, current)=> {
            if(!previous[current[property]]) {
                previous[current[property]] = [current];
            } else {
                previous[current[property]].push(current);
            }

            return previous;
        }, {});

        return Object.keys(groupedCollection).map(key => ({ key, value: groupedCollection[key] }));
    }
}

STACKBLITZ DEMO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...