Angular Material Multiple Paginator в одном компоненте и представлении

Имейте 2 таблицы в поле зрения и отображайте некоторые графики вместе с таблицами, все работает, кроме пагинатора на 2 таблицах. , который берет данные из 2-х источников. Когда Paginator верхней таблицы щелкнул, нижняя таблица изменяет данные,

компонент инициализировал пагинатор и таблицы с источниками данных,

My Component.ts

  export class FinancialMetricsComponent implements OnInit, AfterViewInit {

  pageSize = 20;
  dataSource: MatTableDataSource<SnowTicket> | null;
  utilizationDataSource: MatTableDataSource<Utilization> | null;

  @ViewChildren(MatPaginator) paginator = new QueryList<MatPaginator>();
  @ViewChildren(MatSort) sort = new QueryList<MatSort>();




ngOnInit() {

    this.changeDataAccordingToDate();
    this.dataSource = new MatTableDataSource();
    this.data$.pipe(
      filter(Boolean)
    ).subscribe((tickets) => {
      this.accountsData = tickets;
      this.dataSource.data = tickets;
    });

    this.pcsService.getUtilizationData('120').subscribe(resources => {
      this.utilizationSubject$.next(resources);
    });
    this.utilizationDataSource = new MatTableDataSource();
    this.utilizationData$.pipe(
      filter(Boolean)
    ).subscribe((tickets) => {
      this.utilizationData = tickets;
      this.utilizationDataSource.data = tickets;
    });
  }


  ngAfterViewInit(): void {
    this.dataSource.paginator = this.paginator.toArray()[0];
    this.dataSource.sort = this.sort.toArray()[0];

    this.utilizationDataSource.paginator = this.paginator.toArray()[1];
    this.utilizationDataSource.sort = this.sort.toArray()[1];

    }
}

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

View.html

<fury-list name = "AWS Resources Expenditure" [columns] = "columns" (filterChange) = "onFilterChange($event)">
  <mat-table #table [dataSource] = "dataSource" matSort>
    <ng-container *ngFor = "let column of columns">
      <ng-container *ngIf = "column.notCurrency" [matColumnDef] = "column.property">
        <mat-header-cell *matHeaderCellDef mat-sort-header> {{ column.name }}</mat-header-cell>
        <mat-cell *matCellDef = "let row">
          <span class = "fury-mobile-label">{{ column.name }}</span> {{ row[column.property] }}
        </mat-cell>
      </ng-container>
      <ng-container *ngIf = "!column.notCurrency" [matColumnDef] = "column.property">
        <mat-header-cell *matHeaderCellDef mat-sort-header> {{ column.name }}</mat-header-cell>
        <mat-cell *matCellDef = "let row">
          <span class = "fury-mobile-label">{{ column.name }}</span> {{ row[column.property] | currency }}
        </mat-cell>
      </ng-container>
    </ng-container>
    <mat-header-row *matHeaderRowDef = "visibleColumns"></mat-header-row>
    <mat-row *matRowDef = "let row; columns: visibleColumns;"></mat-row>
  </mat-table>
  <mat-paginator #paginator class = "paginator" [pageSize] = "10"></mat-paginator>
</fury-list>



<fury-list name = "AWS EC2 Utilization (Past 120 days)" [columns] = "utilizationColumns" (filterChange) = "onFilterChangeU($event)">
  <mat-table #table [dataSource] = "utilizationDataSource" matSort>

    <ng-container *ngFor = "let column of utilizationColumns">
      <ng-container *ngIf = "!column.isAvg" [matColumnDef] = "column.property">
        <mat-header-cell *matHeaderCellDef mat-sort-header> {{ column.name }}</mat-header-cell>
        <mat-cell *matCellDef = "let row">
          <span class = "fury-mobile-label">{ { column.name }}</span> {{ row[column.property] }}
        </mat-cell>
      </ng-container>
      <ng-container *ngIf = "column.isAvg" [matColumnDef] = "column.property">
        <mat-header-cell *matHeaderCellDef mat-sort-header> {{ column.name }}</mat-header-cell>
        <mat-cell *matCellDef = "let row">
          <span class = "fury-mobile-label">{{ column.name }}</span> {{ row[column.property]}}
          <mat-icon *ngIf = "row[column.property] < 10"> trending_down</mat-icon>
          <mat-icon *ngIf = "row[column.property] > 70"> trending_up</mat-icon>
        </mat-cell>
      </ng-container>
    </ng-container>

    <mat-header-row *matHeaderRowDef = "visibleColumnsU"></mat-header-row>
    <mat-row *matRowDef = "let row; columns: visibleColumnsU;"></mat-row>
  </mat-table>
  <mat-paginator #paginatorU class = "paginator" [pageSize] = "5"></mat-paginator>
</fury-list>
Тестирование функциональных 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
5
0
6 728
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

добавлено 2 пагинатора, но проблема все еще существует

Tharaka_Ravishan 28.02.2019 08:01
Ответ принят как подходящий

Я бы связал пагинаторы на основе их переменной шаблона и не полагался бы на QueryList, чтобы содержать их в правильном порядке.

@ViewChild('paginator') paginator: MatPaginator;
@ViewChild('paginatorU') paginatorU: MatPaginator;

ngAfterViewInit(): void {
  this.dataSource.paginator = this.paginator;
  this.dataSource.sort = this.sort.toArray()[0];
  this.utilizationDataSource.paginator = this.paginatorU;
  this.utilizationDataSource.sort = this.sort.toArray()[1];
}

есть ли способ добавить идентификатор #sortU в html и использовать ViewChild в машинописном тексте?

shaheer shukur 28.08.2019 12:02

Это не будет работать с кнопкой «Назад», вы получите ужасную ошибку «ExpressionChangedAfterItHasBeenCheckedError: выражение изменилось после проверки. Предыдущее значение: «undefined». Текущее значение: «[object Object]»

thxmike 15.04.2020 16:34

@thxmike, какое решение этой проблемы?

osiris 30.07.2021 18:42

Как упоминалось в предыдущих ответах, у компонента должно быть столько пагинаторов, сколько необходимо, и они должны быть названы:

@ViewChild('firstPaginator', {static: true}) firstPaginator: MatPaginator;
@ViewChild('secondPaginator', {static: true}) secondPaginator: MatPaginator;

И представление должно вызывать эти пагинаторы:

    <mat-paginator #firstPaginator [pageSize] = "5"></mat-paginator>

    <mat-paginator #secondPaginator [pageSize] = "5"></mat-paginator>

в вашем FinancialMetricsComponent добавьте:

@ViewChild(MatPaginator, {static: true}) paginator: MatPaginator;

и добавить публичную функцию

public handlePageBottom(event: PageEvent) {
    this.paginator.pageSize = event.pageSize;
    this.paginator.pageIndex = event.pageIndex;
    this.paginator.page.emit(event);
}

в файле HTML поместите два пагинатора:

<mat-paginator [length] = "countItems" #paginator [pageSizeOptions] = "[5, 10, 20, 50]"></mat-paginator>

<mat-table></mat-table>

<mat-paginator (page) = "handlePageBottom($event)" [pageSize] = "paginator.pageSize"
                   [pageIndex] = "paginator.pageIndex" [length] = "paginator.length"
                   [pageSizeOptions] = "paginator.pageSizeOptions"></mat-paginator>

На сегодняшний день лучший ответ, ИМО

speckledcarp 05.02.2021 21:55

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