【问题标题】:Angular 5 Material Table With Paginator in Tab is Blank Until Change选项卡中带有分页器的 Angular 5 材质表在更改之前为空白
【发布时间】:2018-06-24 11:35:28
【问题描述】:

我将材料示例表复制到我的应用程序的一个选项卡中。如果我向表格添加分页,它最初会显示为空,直到我单击新页面或页面大小。

这是有道理的,因为文档说“在视图初始化之后设置分页器,因为该组件将能够查询其视图以获取已初始化的分页器。”但我想知道在选项卡内初始化表格以便我可以使用分页器的最佳做法是什么。

谢谢!

代码: HTML

<div class="example-container mat-elevation-z8">
  <mat-table #table [dataSource]="dataSource">

    <!-- Position Column -->
    <ng-container matColumnDef="position">
      <mat-header-cell *matHeaderCellDef> No. </mat-header-cell>
      <mat-cell *matCellDef="let element"> {{element.position}} </mat-cell>
    </ng-container>

    <!-- Name Column -->
    <ng-container matColumnDef="name">
      <mat-header-cell *matHeaderCellDef> Name </mat-header-cell>
      <mat-cell *matCellDef="let element"> {{element.name}} </mat-cell>
    </ng-container>

    <!-- Weight Column -->
    <ng-container matColumnDef="weight">
      <mat-header-cell *matHeaderCellDef> Weight </mat-header-cell>
      <mat-cell *matCellDef="let element"> {{element.weight}} </mat-cell>
    </ng-container>

    <!-- Symbol Column -->
    <ng-container matColumnDef="symbol">
      <mat-header-cell *matHeaderCellDef> Symbol </mat-header-cell>
      <mat-cell *matCellDef="let element"> {{element.symbol}} </mat-cell>
    </ng-container>

    <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
    <mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
  </mat-table>

  <mat-paginator #paginator
                 [pageSize]="10"
                 [pageSizeOptions]="[5, 10, 20]">
  </mat-paginator>
</div>

代码:TS

import {Component, ViewChild} from '@angular/core';
import {MatPaginator, MatTableDataSource} from '@angular/material';

/**
 * @title Table with pagination
 */
@Component({
  selector: 'table-pagination-example',
  styleUrls: ['table-pagination-example.css'],
  templateUrl: 'table-pagination-example.html',
})
export class TablePaginationExample {
  displayedColumns = ['position', 'name', 'weight', 'symbol'];
  dataSource = new MatTableDataSource<Element>(ELEMENT_DATA);

  @ViewChild(MatPaginator) paginator: MatPaginator;

  /**
   * Set the paginator after the view init since this component will
   * be able to query its view for the initialized paginator.
   */
  ngAfterViewInit() {
    this.dataSource.paginator = this.paginator;
  }
}

export interface Element {
  name: string;
  position: number;
  weight: number;
  symbol: string;
}

const ELEMENT_DATA: Element[] = [
  {position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H'},
  {position: 2, name: 'Helium', weight: 4.0026, symbol: 'He'},
  {position: 3, name: 'Lithium', weight: 6.941, symbol: 'Li'},
  {position: 4, name: 'Beryllium', weight: 9.0122, symbol: 'Be'},
  {position: 5, name: 'Boron', weight: 10.811, symbol: 'B'},
  {position: 6, name: 'Carbon', weight: 12.0107, symbol: 'C'},
  {position: 7, name: 'Nitrogen', weight: 14.0067, symbol: 'N'},
  {position: 8, name: 'Oxygen', weight: 15.9994, symbol: 'O'},
  {position: 9, name: 'Fluorine', weight: 18.9984, symbol: 'F'},
  {position: 10, name: 'Neon', weight: 20.1797, symbol: 'Ne'},
  {position: 11, name: 'Sodium', weight: 22.9897, symbol: 'Na'},
  {position: 12, name: 'Magnesium', weight: 24.305, symbol: 'Mg'},
  {position: 13, name: 'Aluminum', weight: 26.9815, symbol: 'Al'},
  {position: 14, name: 'Silicon', weight: 28.0855, symbol: 'Si'},
  {position: 15, name: 'Phosphorus', weight: 30.9738, symbol: 'P'},
  {position: 16, name: 'Sulfur', weight: 32.065, symbol: 'S'},
  {position: 17, name: 'Chlorine', weight: 35.453, symbol: 'Cl'},
  {position: 18, name: 'Argon', weight: 39.948, symbol: 'Ar'},
  {position: 19, name: 'Potassium', weight: 39.0983, symbol: 'K'},
  {position: 20, name: 'Calcium', weight: 40.078, symbol: 'Ca'},
];

【问题讨论】:

    标签: angular typescript pagination tabs material-design


    【解决方案1】:

    我在尝试将 mat-pagination 与传统数据表结合使用时遇到了同样的问题,因为默认情况下页面大小未定义,然后我查看文档发现当分页器更改时会发出页面事件页面大小或页面索引,所以我创建了一个具有默认值的行为主题,例如:

    paginationDetail = new BehaviorSubject(
    {
     length: 10,
     pageIndex: 0,
     pageSize: 10
    });
    

    然后,在您的 HTML 中,您可以在 mat-paginator 上添加事件监听器,例如:

    <mat-paginator #paginator
                 (page)="getUpdate($event)"
                 [pageSize]="10"
                 [pageSizeOptions]="[5, 10, 20]">
    </mat-paginator>
    

    这个getUpdate方法会在每次分页变化时被调用,所以我们可以用新的值替换behaviourSubject的默认值,比如:

    getUpdate(event) {
      this.paginationDetail.next(event);
    }
    

    您可以使用这个behaviourSubject 来获取分页上的最新值。所以基本思想是分配默认值,直到您从分页触发更新。 同样,此解决方案是如果您将 mat-pagination 与传统数据表一起使用。如果使用 mat-table 我不认为你应该有任何直接分配 this.myDataSource.paginator = this.paginator;

    【讨论】:

      【解决方案2】:

      我遇到了这个问题,结果是这样的:

      import { AfterViewInit } from '@angular/core';
      

      并添加

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

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-12
        • 1970-01-01
        • 1970-01-01
        • 2015-09-06
        • 2015-09-01
        • 2019-04-11
        相关资源
        最近更新 更多