【问题标题】:Pagination does not work in angular 7. (I use angular material)分页在角度 7 中不起作用。(我使用角度材料)
【发布时间】:2026-02-10 05:10:01
【问题描述】:

我需要在客户端实现分页。从后面,我收到我以卡片形式带来的待办事项。我决定连接 mat-paginator,但遇到了问题。我将待办事项的数量传递给 [length] = "length",但是翻页并将总数分成几部分不起作用,将它们显示在不同的页面上。例如,我现在有 13 个待办事项(可能还有更多),我需要在 1 页上显示 4 个待办事项。 4 然后上第二个,依此类推。 这是我的代码。

component.html

...
<div class="tasks-list" >
    <mat-card class="task-card" *ngFor="let task of tasks">
        <mat-card-header>
            <mat-card-title>
/////////some code////////////
 </mat-card>
</div>

<mat-paginator [length]="length"
          [pageSize]="4"
          [pageSizeOptions]="[4, 8, 12]">
</mat-paginator>

component.ts

@ViewChild(MatPaginator) paginator: MatPaginator;
constructor(private taskService: TaskListService) {}
ngOnInit() { this.getTasks();}

getTasks() {
this.taskService.getTasks()
  .subscribe(
    (data) => {
      this.tasks = data;
      this.length = this.tasks.length;
    }) 
}

我很困惑下一步该怎么做才能让它发挥作用。到处我主要写如何在表格中打开分页,但我没有表格。如果该行添加'async',则它将不起作用。

【问题讨论】:

    标签: html typescript angular-material angular7


    【解决方案1】:

    分页器使用表格数据源。

    所有的分页工作都是在迭代器方法中完成的。此方法计算出skip and take,并将其分配给卡片列表的dataSource。

    Live Demo

    查看:

    <div class="tasks-list">
        <mat-card class="task-card" *ngFor="let task of dataSource">
            <mat-card-header>
                <mat-card-title>
            {{task}}
                </mat-card-title>
            </mat-card-header>
        </mat-card>
    </div>
    
    <mat-paginator #paginator [pageSize]="pageSize" [pageSizeOptions]="[1, 10, 20]" [showFirstLastButtons]="true" [length]="totalSize"
        [pageIndex]="currentPage" (page)="pageEvent = handlePage($event)">
    </mat-paginator>
    

    组件:

    export class PaginatorOverviewExample implements OnInit {
      public tasks: any[];
    
      public dataSource: any;
      public pageSize = 1;
      public currentPage = 0;
      public totalSize = 0;
    
      @ViewChild(MatPaginator) paginator: MatPaginator;
    
      ngOnInit() { this.getTasks(); }
    
      getTasks() {
        // Replace with HTTP call
        var data = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"];
        this.dataSource = new MatTableDataSource<any>(data);
        this.dataSource.paginator = this.paginator;
        this.tasks = data;
        this.totalSize = this.tasks.length;
        this.iterator(); 
      }
    
      handlePage(event?: PageEvent) {
        this.currentPage = event.pageIndex;
        this.pageSize = event.pageSize;
        this.iterator();
      }
    
      private iterator() {
        const end = (this.currentPage + 1) * this.pageSize;
        const start = this.currentPage * this.pageSize;
        const part = this.tasks.slice(start, end);
        this.dataSource = part;
      }
    }
    

    【讨论】: