动态数据的分页器/排序不起作用

Posted

技术标签:

【中文标题】动态数据的分页器/排序不起作用【英文标题】:Paginator/Sorting for dynamic data does not work 【发布时间】:2021-07-07 13:57:52 【问题描述】:

我有一个来自端点的数据并将其放入 MatTableDataSource。当我想使用分页或搜索时,我能够显示数据,但无法找到更新表格的方法,没有发生任何事情。

当我尝试使用静态数据时会更容易,但使用动态数据时,我只能一次显示所有数据并注意能够做更多事情。

预期的行为是什么?

通过分页器切换页面时,表格应该刷新。

目前的行为是什么?

通过分页器切换页面时表格不刷新。

重现的步骤是什么?

很遗憾,我无法提供功能性 Plunker,因为我使用的数据来自我的后端应用程序。

这是我当前的代码(它只是在表格中显示数据,搜索或分页都不起作用)

<mat-form-field>
    <mat-label>Search ID</mat-label>
    <input  (keyup)="applySearch($event.target.value)" matInput placeholder="Filter" >
  </mat-form-field>
<table mat-table [dataSource]="certifications"   class="mat-elevation-z8">

    <ng-container matColumnDef="id">
      <th mat-header-cell *matHeaderCellDef> ID </th>
      <td mat-cell *matCellDef="let cert">  cert.num  </td>
    </ng-container>
  

    <ng-container matColumnDef="NumO">
      <th mat-header-cell *matHeaderCellDef> NumO </th>
      <td mat-cell *matCellDef="let cert"> cert.NumO </td>
    </ng-container>
  

    <ng-container matColumnDef="Name">
      <th mat-header-cell *matHeaderCellDef> Name </th>
      <td mat-cell *matCellDef="let cert"> cert.Name </td>
    </ng-container>
  

    <ng-container matColumnDef="Unit">
      <th mat-header-cell *matHeaderCellDef> Symbol </th>
      <td mat-cell *matCellDef="let cert"> cert.Unit </td>
    </ng-container>


        <ng-container matColumnDef="State">
            <th mat-header-cell *matHeaderCellDef> State </th>
            <td mat-cell *matCellDef="let cert"> cert.State </td>
          </ng-container>
          <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
          <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
        </table>
          <!-- YOU CAN CHANGE THE PAGE SIZE HERE -->
        <mat-paginator #paginator [pageSizeOptions]="[2, 4, 6]"   
      
      showFirstLastButtons></mat-paginator>
  

produits.component.ts

import  Component, OnInit,ViewChild  from '@angular/core';
import  HttpClient, HttpHeaders  from '@angular/common/http';
import  Certification  from './produits';
import  ProduitService  from './produits.service'
import  MatPaginator  from '@angular/material/paginator';
import  MatTableDataSource  from '@angular/material/table';

@Component(
  selector: 'app-produits',
  templateUrl: './produits.component.html',
  styleUrls: ['./produits.component.scss'],
)
export class ProduitsComponent implements OnInit 
  displayedColumns: string[] = [
    'num',
    'numO',
    'Name',
    'Unit',
    'State',
  ];
  certifications = new Array<Certification>()
  dataSource = new MatTableDataSource(this.certifications);

  applySearch(filterValue: string) 
    this.dataSource.filter = filterValue.trim().toLowerCase();

  

  constructor(certService:ProduitService) 

    certService.getCertifications().subscribe(
      certifications => 
        this.certifications = certifications;
        console.log(this.certifications);
      
    )

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

  ngOnInit(): void 
    this.dataSource.paginator = this.paginator;
  

  ngAfterViewInit() 
    console.log('heeeeeeeeeeeey')
    this.dataSource = new MatTableDataSource(this.certifications);
    this.dataSource.paginator = this.paginator;
  
  

【问题讨论】:

【参考方案1】:

好的,首先尝试避免在构造函数中调用 api 这不是一个好方法, 第二件事你将错误的数据传递给你的 html [dataSource]="certifications" 但是 可以给你这么简单明了的代码吗

/* Declaration */
displayedColumns: string[] = [
  'num',
  'numO',
  'Name',
  'Unit',
  'State',
];
/* this code will help you to refresh pagination  */
private paginator: MatPaginator;
private sort: MatSort;
@ViewChild(MatSort, 
  static: false
) set matSort(ms: MatSort) 
  this.sort = ms;
  this.setPaginationAndSort();

@ViewChild(MatPaginator, 
  static: false
) set matPaginator(
  mp: MatPaginator
) 
  this.paginator = mp;
  this.setPaginationAndSort();

certifications: any = new MatTableDataSource([]);
constructor(public certService: ProduitService) 
ngOnInit() 
  this.getCertification()


getCertification() 
  this.certService.getCertifications().subscribe(
    certifications => 
      this.certifications = new MatTableDataSource(certifications);
      this.setPaginationAndSort()
      console.log(this.certifications);
    
  )

setPaginationAndSort() 
  this.certifications.paginator = this.paginator;
  this.certifications.sort = this.sort;

  applySearch(filterValue: string) 
    this.certifications.filter = filterValue.trim().toLowerCase();

  

【讨论】:

首先非常感谢 Jasmine,我尝试按照您的操作进行操作,不幸的是它没有用,然后我复制了 getCertification() 的正文后出现 Property 'certService' does not exist on type 'ProduitsComponent'. 之类的错误 ... 并将其放入构造函数 中,它确实按预期工作。我真的很迷茫,因为现在它正在工作,但我不知道如何解释。 constructor (public certService: ProductService) 只需在 certService 之前添加“public”我忘记了,当您尝试调用 certService 时使用“this.certService”它会起作用,问题在你您在 html 中使用“证书”数组的代码,但在 ts 中,您将所有处理应用于 dataSource 数组,这就是您的表不会更改的原因 按预期工作,非常感谢 Jasmine。

以上是关于动态数据的分页器/排序不起作用的主要内容,如果未能解决你的问题,请参考以下文章

直接使用分页器并在关联列上定义排序不起作用

分页链接不起作用 /page/2 - 未找到 - Wordpress

使用 ajax 时,Tablesorter 禁用分页器按钮不起作用

Kendo UI Grid 上的分页不起作用

为啥我在 codeigniter 中的分页不起作用? (404 未找到)

在Codeigniter中搜索的分页不起作用