【问题标题】:Using Angular Material Paginator with Observable and without tables使用带有 Observable 和不带表格的 Angular Material Paginator
【发布时间】:2021-06-04 07:44:42
【问题描述】:

(请帮忙,仍然没有解决)所以我正在关注这个stackoverflow(with mat-card)this(with observable)来尝试解决我的问题。

我有一个对象数组的 observable,我想使用 *ngFormat-card 来显示它们,然后在页面的最底部有一个分页器。

现在,可观察对象已正确链接(因为它正在显示),但分页器似乎没有显示任何内容(pic),想知道是否有人可以提供帮助,非常感谢!

(其他功能的代码很多,所以我会尽量只列出我们需要的,如果你觉得有什么遗​​漏,请告诉我)

HTML:

<div *ngIf="obs| async as objects>
 <div>
  <div>
   <mat-card *ngFor="let ob of objects"> ... </mat-card>
  </div>
  <mat-paginator
  [showFirstLastButtons]="true"
  [pageSizeOptions]="[10, 20, 50, 100]"> 
  </mat-paginator>
 </div>

TS: 旁注:filtered$ 是我用于 mat-card 的数组的原始 observable,现在我正在添加分页器,所以在 HTML 中你可以看到我更改为 obs

public dataSource = new MatTableDataSource();
@ViewChild(MatPaginator) paginator: MatPaginator;
obs: Observable<any>;
public filtered$: Observable<Array<An Object>>;

constructor(private changeDetectorRef: ChangeDetectorRef){};

ngOnInit(){
...;
  this.filtered$
  .pipe(takeUntil(...))
  .subscribe((arr) => (this.dataSource.data = arr));
 this.changeDetectorRef.detectChanges();
 this.dataSource.paginator = this.paginator;
 this.obs = this.dataSource.connect();
}

【问题讨论】:

  • 即使我添加了[length]="objects.length",它在分页器上显示数字,但功能不起作用

标签: angular angular-material observable paginator


【解决方案1】:

你需要使用table上的dataSource

或者如果你想在没有表和数据源的情况下使用你需要管理分页器上的总数据

             <mat-paginator 
                (page)="onPageChange($event)"
                [showFirstLastButtons]="true"
                [length]="total"
                [pageSize]="limit"
                [pageSizeOptions]="[5, 10, 25, 100]">
            </mat-paginator>

total 是项目总数,limitSize 是页面的产品数量

【讨论】:

  • 谢谢。我不认为你会“需要”在桌子上使用 dataSource 吗?从我上面附加的链接之一,一个没有使用表。我想知道你能否告诉我你用onPageChange($event) 函数做了什么? “pageSizeOptions”不是决定了“pageSize”吗?
  • @WendyZhang,pageSizeOptions 无法确定pageSize。因为pageSize 是您希望在单个页面上显示的默认元素数。而pageSizeOptions 是可供选择的选项。
  • 谢谢! pageSize 似乎不是这里的问题
  • 看看我的回答。
  • @ZunayedShahriar 是的,谢谢。下面有一些cmets。我假设您使用的是*ngFor = pagedDataArray?但我认为这不是分页器应该如何工作的。 *ngFor 应该包含数组中的所有元素。如果没有,那么我的其他功能将无法正常工作...Cannot read property 'slice' of null 有一些错误
【解决方案2】:

建议:您必须保留单独的数组或可观察对象。一个用于显示分页数据,另一个用于存储所有数据。

HTML:

<mat-paginator *ngIf="total > 0"
    [length]="total"
    [pageSize]="pageSize"
    [pageIndex]="pageIndex"
    (page)="pageChanged($event)"
    [pageSizeOptions]="[5, 10, 25, 100]">
</mat-paginator>

注意:我认为当你没有任何数据时你不应该显示分页器。

打字稿:

pageChanged(event: any) {
    this.pageIndex = event.pageIndex;
    this.setFilteredData();
}

setFilteredData() {
    this.yourPagedDataArray = this.yourAllDataArray.slice(this.pageSize * this.pageIndex, this.pageSize * this.pageIndex + this.pageSize);
}

注意:您需要在数据提取完成后调用setFilteredData() 方法。

【讨论】:

  • 感谢您的回复。我只是想知道“pagedDataArray”和“allDataArray”有什么区别?从现在开始我只有 observables,但没有原始数组,我怎么能在不使用订阅的情况下使用 slice
  • 现在我的理解是,如果pagedDataArray 用于当前页面/s 信息,而allDataArray 用于所有人。但是我什么时候使用pagedDataArray?在我的 HTML 中,我总是使用 allDataArray observable
猜你喜欢
  • 2018-03-23
  • 2020-04-04
  • 2020-12-01
  • 2020-01-15
  • 2018-01-28
  • 2020-08-20
  • 1970-01-01
  • 2019-05-09
  • 2019-12-22
相关资源
最近更新 更多