typescript ngIf内部的MatPaginator意外行为?

umuewwlo  于 2023-01-27  发布在  TypeScript
关注(0)|答案(5)|浏览(137)

STACKBLITZ DEMO
我有一个材料表如下:

<table mat-table [dataSource]="dataSource" >
    ... Rows ...
    <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
    <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>  
<mat-paginator #MatPaginator [pageSizeOptions]="[4]" showFirstLastButtons></mat-paginator>

我需要在变量info为false时隐藏表。
1.* * 尝试1:**

<table *ngIf="info" mat-table [dataSource]="dataSource" >

它工作正常,但是当info为true并且所有行都显示在第一页上时,分页不起作用。
1.* * 尝试2:**

<table [hidden]="!info" mat-table [dataSource]="dataSource" >

使分页工作,但当info为false时,表仍显示为无结果。
1.* * 尝试3:**
尝试使用div对整个表进行sourround,并将*ngIf应用于div。结果:与第一次尝试相同的问题。
已尝试将[hidden]应用于div,但仍无法隐藏。
1.* * 编辑:尝试4:**
直接应用于包络div css style="display:none"并获得与尝试3相同的结果,即使该表没有值也会显示。
关于如何在info为false时隐藏表,在info为true时显示表,并使用有效的分页,您有什么想法吗?
谢谢!

fumotvh3

fumotvh31#

用这种方法

[hidden]="true"

<div [hidden]="true" >
  <table mat-table [dataSource]="dataSource" >
      <ng-container matColumnDef="test">
        <th mat-header-cell *matHeaderCellDef> Test. </th>
          <td mat-cell *matCellDef="let exp"> {{exp}} </td>
      </ng-container>
      <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
      <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
  </table>  
  <mat-paginator #MatPaginator [pageSizeOptions]="[2, 4, 6]" showFirstLastButtons> 
  </mat-paginator>
<div>

stackblitz demo
确保在[隐藏]中更改您的条件

pbpqsu0x

pbpqsu0x2#

您可以使用ngClass添加动态类,并使用该类隐藏表,如

[ngClass]="{'hidden': !info}"

在你的风格里. css

.hidden{
display:none;
}

demo

wbgh16ku

wbgh16ku3#

你不能把paginator放在ngIf里面,否则,当你设置this.dataSource.paginator = this.paginator的时候,this.paginator是未定义的。如果你真的想ngIf它,有一个解决方案(如果真的有必要,告诉我),但是我建议把它改为hidden

ru9i0ody

ru9i0ody4#

Angular 8解:

  • [hidden]可以代替ngIf**使用,并且可以使用CSS属性激活选项卡。
.tableClass .mat-tab-group.mat-primary .mat-ink-bar {
          width: 160px !important;
        }
<div [hidden]="true" class="tableClass">
     <mat-tab-group>
        <mat-tab label="Tab1">
        </mat-tab>
        <mat-tab label="Tab2">
        </mat-tab>
     </mat-tab-group>
</div>
eoigrqb6

eoigrqb65#

我遇到了同样的问题,因为我在模板中使用了*ngIfasync pipe,分页不起作用。经过一番研究,我能够使用@ViewChild注解和一个set函数使它起作用,所以我决定在这里分享我的完整解决方案:)
其他答案提出的hidden解决方案对我不起作用。
在我的组件.ts文件中:

constructor(private cdRef: ChangeDetectorRef) { }

  private paginator: MatPaginator;
  /*
   We are using @ViewChild because of the ngIf with async pipe on the template
   When the data is emmited for the first time from the observable, we need to bind the
   pagination component with the datasource. This can be achieved with the code bellow.
  */
  @ViewChild(MatPaginator) set matPaginator(mp: MatPaginator) {
    if(mp) {
      this.paginator = mp;
      this.dataSource = new MatTableDataSource<any>(your_data);
      this.dataSource.paginator = this.paginator;
      this.cdRef.detectChanges();
     }
   }

在我的模板文件中:

// my observable with the async pipe
  <div *ngIf="raceList$ | async as races">
    <div class="mat-table-width">
      <table mat-table [dataSource]="dataSource">
      ...
      </table>
      <mat-paginator [pageSizeOptions]="[10, 20, 30]"
                      showFirstLastButtons
                      aria-label="select page of races">
      </mat-paginator>
    </div>
  </div>

有了这个解决方案,我能够显示表中的数据并使分页工作。

相关问题