How to Synchronize mat-paginator Page Sizes?

Discussão em 'Angular' iniciado por Andrew Biddle, Junho 3, 2025.

  1. I'm attempting to synchronize the page sizes of multiple mat-paginators that are nested across multiple child components.

    I'm using a shared service to store the "global" page size.

    However, the page size is being updated across all the mat-paginators but the actual page size of the paginators is not changing.

    [​IMG]

    [​IMG]

    Shared Service:

    import { EventEmitter, Injectable } from "@angular/core";
    import { BehaviorSubject } from "rxjs";

    @Injectable({
    providedIn: 'root'
    })
    export class PaginatorService {
    private pageSizeSubject = new BehaviorSubject<number>(10); // Default page size
    pageSize$ = this.pageSizeSubject.asObservable();

    setPageSize(pageSize: number) {
    this.pageSizeSubject.next(pageSize);
    }
    }


    Child Table Component:

    <table mat-table [dataSource]="propertiesDataSource" multiTemplateDataRows class="mat-elevation-z0" id="properties-table" matSort>
    <ng-container *ngFor="let column of propertiesTableColumns" [matColumnDef]="column">
    <th mat-header-cell *matHeaderCellDef mat-sort-header>{{ tableHeader[column] }}</th>
    <td mat-cell *matCellDef="let lease">
    <ng-container [ngSwitch]="column">
    <span *ngSwitchDefault>{{ lease[column] }}</span>
    </ng-container>
    </td>
    </ng-container>

    <tr mat-header-row *matHeaderRowDef="propertiesTableColumns; sticky:true"></tr>
    <tr mat-row *matRowDef="let property; columns: propertiesTableColumns" (click)="openProperty(property)" class="item-row"></tr>
    </table>
    <mat-paginator [pageSizeOptions]="[10,25,50,100]" [pageSize]="pageSize" (page)="onPageSizeChange($event)" showFirstLastButtons>
    </mat-paginator>


    export class LocationDetailPropertyTableComponent implements OnInit, AfterViewInit {
    @Input() properties: PropertyDtoModel[] = [];
    @Input() locationCustomerID: number;
    @Input() dateFilter: Date = new Date();

    @ViewChild(MatPaginator) paginator: MatPaginator;

    public propertiesDataSource: MatTableDataSource<PropertyDtoModel> = new MatTableDataSource();
    public propertiesTableColumns = Object.keys(eTableHeader) as Array<keyof typeof eTableHeader>;
    public tableHeader = eTableHeader;
    public pageSize: number;

    constructor(
    private router: Router,
    private rentersLegalLiabilityService: RentersLegalLiabilityService,
    private paginatorService: PaginatorService,
    private chageDetectorRef: ChangeDetectorRef
    ) {}

    ngAfterViewInit(): void {
    this.propertiesDataSource.paginator = this.paginator;
    }

    ngOnInit() {
    this.propertiesDataSource = new MatTableDataSource(this.properties);

    this.paginatorService.pageSize$.subscribe(size => {
    this.pageSize = size;
    this.chageDetectorRef.detectChanges(); // Manually trigger a change detection
    });
    }

    onPageSizeChange(event: any) {
    this.paginatorService.setPageSize(event.pageSize);
    }


    Parent Page Component:

    <table mat-table [dataSource]="locationDataSource" multiTemplateDataRows class="mat-elevation-z0" id="locations-table" matSort>
    <!-- column for Expand button -->
    <ng-container matColumnDef="ExpandButton">
    <th mat-header-cell *matHeaderCellDef></th>
    <td mat-cell *matCellDef="let location" (click)="$event.stopPropagation()">
    <button mat-icon-button (click)="expandedLocation=expandedLocation===location ? null : location"
    matTooltip="Expand">
    <span class="mat-button-wrapper">
    <mat-icon>
    {{expandedLocation === location ? "expand_more": "chevron_right"}}
    </mat-icon>
    </span>
    </button>
    </td>
    <td mat-foter-cell *matFooterCellDef></td>
    </ng-container>

    <ng-container *ngFor="let header of tableHeaders" [matColumnDef]="header.key">
    <th mat-header-cell *matHeaderCellDef mat-sort-header>{{ header.label }}</th>
    <td mat-cell *matCellDef="let location">{{ location[header.key] }}</td>
    <td mat-footer-cell *matFooterCellDef>{{ getFooterContent(header) }}</td>
    </ng-container>

    <!-- Expanded content column -->
    <ng-container matColumnDef="expandedDetail">
    <td mat-cell *matCellDef="let location" [attr.colspan]="locationsTableColumns.length">
    <div [@detailExpand]="location == expandedLocation ? 'expanded' : 'collapsed'">
    <location-detail-property-table [properties]="location.LocationProperties" [locationCustomerID]="location.LocationCustomerID" [dateFilter]="dateFilter"></location-detail-property-table>
    </div>
    </td>
    </ng-container>

    <tr mat-header-row *matHeaderRowDef="locationsTableColumns; sticky:true"></tr>
    <tr mat-row *matRowDef="let location; columns: locationsTableColumns" class="item-row"></tr>
    <tr mat-row *matRowDef="let row; columns: ['expandedDetail']" class="detail-row"></tr>
    <tr mat-footer-row *matFooterRowDef="locationsTableColumns"></tr>
    </table>


    I've tried forcing the change detection with no luck. After changing the pagination from 10-25 on another expanded table all other paginators should be updated to 25 page size as well.

    Continue reading...

Compartilhe esta Página