You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular Material 18:Mat-paginator [length]初始化异常问题排查

Angular Material 18 Mat-Paginator 初始化显示条目数为0的问题分析与解决

问题原因

  • ViewChild 初始化时机错误:在ngOnInit中尝试给dataSource.paginator赋值时,组件视图还未完全渲染,@ViewChild(MatPaginator)获取到的paginator实例尚未初始化,此时的赋值操作无效。
  • 重复设置分页长度导致冲突:HTML模板通过[length]="totalItems"绑定总条目数,但TS代码的loadData方法中又直接设置this.paginator.length,加上totalItems初始值为0,异步请求返回数据后,由于paginator未完成初始化,视图无法同步更新长度值。
  • 手动修改页大小触发正常初始化:通过UI修改页大小时,paginator已完成实例化,此时会触发page事件,重新加载数据并同步分页状态,后续功能因此恢复正常。

解决方案

1. 调整生命周期钩子,视图初始化后绑定paginator

将dataSource.paginator的赋值移到ngAfterViewInit中,确保paginator实例已就绪:

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

2. 统一分页长度的数据源

移除TS中直接设置this.paginator.length的代码,仅通过HTML模板的[length]="totalItems"控制总条目数,保持数据绑定一致性:
修改loadData方法:

loadData(pageNumber: number, pageSize: number) {
  this.colorService.getColors(pageNumber, pageSize).subscribe(response => {
    this.dataSource.data = response.items;
    this.totalItems = response.paging.totalItems;
    if (this.paginator) {
      this.paginator.pageIndex = response.paging.pageNumber - 1;
    }
    this.cdr.detectChanges();
  });
}

3. 优化分页事件参数类型(可选)

用PageEvent类型代替any,提升类型安全性:

import { PageEvent } from '@angular/material/paginator';

// ...

onPageChange(event: PageEvent) {
  this.loadData(event.pageIndex + 1, event.pageSize);
}

修改后的完整TS代码示例

import { Component, OnInit, ViewChild, AfterViewInit, ChangeDetectorRef } from '@angular/core';
import { MatTableDataSource } from '@angular/material/table';
import { MatPaginator, PageEvent } from '@angular/material/paginator';
import { ColorsHttpService } from './path-to-your-service';

@Component({
  // 组件元数据
})
export class YourComponent implements OnInit, AfterViewInit {
  displayedColumns: string[] = ['id', 'name'];
  dataSource = new MatTableDataSource<any>();
  totalItems = 0;

  @ViewChild(MatPaginator) paginator!: MatPaginator;

  constructor(private colorService: ColorsHttpService, private cdr: ChangeDetectorRef) {}

  ngOnInit(): void {
    this.loadData(1, 10);
  }

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

  loadData(pageNumber: number, pageSize: number) {
    this.colorService.getColors(pageNumber, pageSize).subscribe(response => {
      this.dataSource.data = response.items;
      this.totalItems = response.paging.totalItems;
      if (this.paginator) {
        this.paginator.pageIndex = response.paging.pageNumber - 1;
      }
      this.cdr.detectChanges();
    });
  }

  onPageChange(event: PageEvent) {
    this.loadData(event.pageIndex + 1, event.pageSize);
  }
}

内容的提问来源于stack exchange,提问作者SiSharp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 11:26:17