Как рассчитать сумму столбцов таблицы и показать в нижнем колонтитуле с помощью Angular?

Я пытаюсь показать общее количество значений столбца в нижнем колонтитуле таблицы, используя Angular. Как рассчитать сумму столбцов таблицы и показать в нижнем колонтитуле с помощью Angular?

 <mat-header-row class = "sticky-header" *matHeaderRowDef = "['player', 'team', 'goals']"></mat-header-row>
      <mat-row *matRowDef = "let row; columns: ['player', 'team', 'goals']"></mat-row>
      <mat-row class = "sticky-footer" *matRowDef = "let row: columns: ['total']; when:isLastRow"></mat-row>

...

 export class AppComponent {

  dataSource: PlayerDataSource;

  isLastRow = (data, index) => index === this.players.length;

  players = STATS.slice();

  constructor() {
    this.dataSource = new PlayerDataSource();
    this.dataSource.use(this.players.slice());
  }

}

После прочтения этого тема на гитхабе я создал пример этот стекблиц, но сумма не отображается в нижнем колонтитуле.

Кто-нибудь может пролить свет на эту тему? Примера по этому поводу нет. Спасибо.

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
3
0
14 455
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В документация углового материала есть инструкции, а также образец в Примеры.

Что вам нужно сделать, так это определить ячейку нижнего колонтитула аналогично тому, как вы это делаете для заголовков в каждом столбце. В привязках столбца для столбца нижнего колонтитула вы непосредственно определяете, как вы вычисляете сумму. Нет необходимости добавлять еще одну строку с итоговыми данными. После этого вы просто добавляете определение строки нижнего колонтитула, и все работает.

Вот измененный шаблон из вашего образца:

<mat-table [dataSource] = "dataSource">

  <!-- Columns -->
  <ng-container matColumnDef = "player">
    <mat-header-cell *matHeaderCellDef> Player </mat-header-cell>
    <mat-cell *matCellDef = "let player"> {{ player.name }}</mat-cell>
    <mat-footer-cell *matFooterCellDef></mat-footer-cell>
  </ng-container>

  <ng-container matColumnDef = "team">
    <mat-header-cell *matHeaderCellDef> Team </mat-header-cell>
    <mat-cell *matCellDef = "let player"> {{ player.team }}</mat-cell>
    <mat-footer-cell *matFooterCellDef></mat-footer-cell>
  </ng-container>

  <ng-container matColumnDef = "goals">
    <mat-header-cell class = "right-align" *matHeaderCellDef> Goals </mat-header-cell>
    <mat-cell class = "right-align" *matCellDef = "let player"> {{ player.goals }}</mat-cell>
    <mat-footer-cell *matFooterCellDef> Total: {{ calculateTotal() }}</mat-footer-cell>
  </ng-container>

  <!-- Rows -->
  <mat-header-row class = "sticky-header" *matHeaderRowDef = "['player', 'team', 'goals']"></mat-header-row>
  <mat-row *matRowDef = "let row; columns: ['player', 'team', 'goals']"></mat-row>
  <mat-footer-row class = "sticky-footer" *matFooterRowDef = "['player', 'team', 'goals']"></mat-footer-row>

</mat-table>

А также измененный код компонента, так что вы видите, что вам не нужно изменять данные.

export class AppComponent {

  dataSource: PlayerDataSource;

  isLastRow = (data, index) => index === this.players.length;

  players = STATS.slice();

  constructor() {
    this.dataSource = new PlayerDataSource();
    this.dataSource.use(this.players.slice());
  }

  public calculateTotal() {
    return this.players.reduce((accum, curr) => accum + curr.goals, 0);
  }

}


export class PlayerDataSource extends DataSource<PlayerOrTotal> {

  dataWithTotal = new BehaviorSubject<PlayerOrTotal[]>([]);

  use(players: Player[]) {
    this.dataWithTotal.next([ ...players]);
  }

  connect(): Observable<PlayerOrTotal[]> {
    return this.dataWithTotal.asObservable();
  }

  disconnect() {}
}

Я также создал форк вашего StackBlitz, где вы можете увидеть, как он работает.

Спасибо! поэтому мне не хватало функции calculateTotal()

david83 08.04.2019 22:42

Да, а также определение строки нижнего колонтитула. Вы определили это как еще одну строку. Проверьте официальную документацию, которую я связал.

AlesD 08.04.2019 22:47

Другие вопросы по теме