【问题标题】:Angular Material MatPaginator showing page 0 of 0Angular Material MatPaginator 显示第 0 页,共 0 页
【发布时间】:2021-03-13 20:33:50
【问题描述】:

抱歉提前提出问题。我在写这篇文章之前搜索了我的问题并尝试了很多解决方案,但没有运气。 我是一个尝试学习材料的 Angular 菜鸟。 我的简单项目发出一个 http 请求并使用收到的 JSON 来填充表格。 Angular Material 表工作正常,但分页器不行。 它是灰色的,显示第 0 页,共 0 页。

component.html如下:

<div style="height: 80vh;">
  <mat-toolbar color="primary">
    <mat-toolbar-row>
      <button mat-icon-button (click)="sidenav.toggle()" fxShow="true" fxHide.gt-sm>
        <mat-icon>menu</mat-icon>
      </button>
      <span>Teste - Requisição Http/Tabela</span>
      <span class="menu-spacer"></span>
    </mat-toolbar-row>
  </mat-toolbar>

  <mat-sidenav-container fxFlexFill>
    <mat-sidenav #sidenav>
      <mat-nav-list>
        <a (click)="sidenav.toggle()" mat-list-item>Fechar</a>
        <a href="#" mat-list-item>Link 1</a>
        <a href="#" mat-list-item>Link 2</a>
        <a href="#" mat-list-item>Link 3</a>
      </mat-nav-list>
    </mat-sidenav>
    <mat-sidenav-content fxFlexFill>
      <table mat-table [dataSource]="dataSource" class="mat-elevation-z8">

        <ng-container matColumnDef="id">
          <th mat-header-cell *matHeaderCellDef> Id </th>
          <td mat-cell *matCellDef="let element"> {{element.id}} </td>
        </ng-container>

        <ng-container matColumnDef="email">
          <th mat-header-cell *matHeaderCellDef> Email </th>
          <td mat-cell *matCellDef="let element"> {{element.email}} </td>
        </ng-container>

        <ng-container matColumnDef="first_name">
          <th mat-header-cell *matHeaderCellDef> First Name </th>
          <td mat-cell *matCellDef="let element"> {{element.first_name}} </td>
        </ng-container>

        <ng-container matColumnDef="last_name">
          <th mat-header-cell *matHeaderCellDef> Last Name </th>
          <td mat-cell *matCellDef="let element"> {{element.last_name}} </td>
        </ng-container>

        <ng-container matColumnDef="avatar">
          <th mat-header-cell *matHeaderCellDef> Avatar </th>
          <td mat-cell *matCellDef="let element"> {{element.avatar}} </td>
        </ng-container>

        <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
        <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
      </table>
      <mat-paginator [pageSizeOptions]="[5, 10, 25, 100]" showFirstLastButtons></mat-paginator>
    </mat-sidenav-content>
  </mat-sidenav-container>
</div>

component.ts如下:

import { HttpClient } from '@angular/common/http';
import { AfterViewInit, Component, ViewChild } from '@angular/core';
import { MatPaginator } from '@angular/material/paginator';
import { MatTableDataSource } from '@angular/material/table';

export interface UserData {
  id: number;
  email: string;
  first_name: string;
  last_name: string;
  avatar: string;
}

const USER_DATA: UserData[] = [];

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements AfterViewInit {
  title = 'Test';
  url = 'https://reqres.in/api/users?page=1';
  displayedColumns: string[] = ['id', 'email', 'first_name', 'last_name', 'avatar'];
  dataSource = new MatTableDataSource<UserData>(USER_DATA);
 
  constructor(private http: HttpClient) {
  
    this.http.get(this.url).toPromise().then(data => {
      console.log(data["data"]);
      this.dataSource = data["data"]
      console.log(this.dataSource)
    });
  }

  @ViewChild(MatPaginator) paginator: MatPaginator;

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

我做错了什么? 谢谢

【问题讨论】:

    标签: angular-material angular-material-table angular-material-paginator


    【解决方案1】:

    尝试在中添加#paginator

    <mat-paginator [pageSizeOptions]="[5, 10, 25, 100]" showFirstLastButtons></mat-paginator>
    

    应该是:

    <mat-paginator #paginator [pageSizeOptions]="[5, 10, 25, 100]" showFirstLastButtons></mat-paginator>
    

    如果没有 id "#paginator",@ViewChild 装饰器将永远无法找到该元素(此 id 必须与 @ViewChild 装饰器行中使用的相同)。 这个小细节没有包含在 Angular Material 文档的分页示例中(或者我看不到它..)

    除此之外,尝试将 dataSource 对象声明为:

    dataSource! = MatTableDataSource&lt;UserData&gt;;

    而不是

    dataSource = new MatTableDataSource&lt;UserData&gt;(USER_DATA);

    然后,当 promise 解决后,以这种方式分配内容

    this.dataSource = new MatTableDataSource&lt;UserData&gt;(data.data);

    而不是

    this.dataSource = data["data"]

    紧接着,将分页器组件分配给dataSource.paginator:

    this.dataSource.paginator = this.paginator;

    【讨论】:

    • 试过但还是不行。还是谢谢
    • 你需要调用 this.dataSource.paginator = this.paginator;在这样的 setTimout 中: setTimeout(() => { this.dataSource.paginator = this.paginator; this.dataSource.sort = this.sort; })
    【解决方案2】:

    尝试删除AfterView 并将ViewChild 替换为以下代码:

    @ViewChild(MatPaginator) set matPaginator(paginator: MatPaginator) {
        this.dataSource.paginator = paginator;
    }
    

    【讨论】:

    • 你的意思是删除implements AfterViewInit和ngAfterViewInit() { this.dataSource.paginator = this.paginator; }?
    • 是的,不要实现 AfterViewInit 并完全删除 ngAfterViewInit() {...}。然后替换这个:@ViewChild(MatPaginator) paginator: MatPaginator;使用我建议的代码。
    【解决方案3】:

    在 Angular 的文档中,他们忘记添加,您需要定义 { static: false} 或 {static: true} 。

    像这样:

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

    在文档中:

    static - 在变更检测运行之前解析查询结果为真, false 在更改检测后解决。默认为 false。

    如果要使用默认值,则需要将其设置为 false。

    【讨论】:

    • 感谢您的快速 Becike,但不幸的是它仍然无法正常工作。分页器仍然显示第 0 页,共 0 页
    • 如果您尝试将 和 放入一个 div 中?值得一试...垫桌有时会很棘手...
    • 将它们放在 div 中也不走运 =(
    • 我还有一个想法:拿到promise中的数据后尝试应用分页器。
    • 顺便说一句,当我从 observable (httpClient) 得到响应时,我通常会创建新的 MatTableDataSource,并立即添加分页器
    猜你喜欢
    • 1970-01-01
    • 2014-01-20
    • 2017-11-08
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 2011-04-15
    相关资源
    最近更新 更多