我正在尝试在我的角度应用程序中实现Material表。分页和过滤器工作正常,但我无法排序我的表。我对MatSort的引用未定义。
我确实在AppModule中导入了它:
import {MatTableModule} from '@angular/material/table';
import {MatTooltipModule} from '@angular/material/tooltip';
import {MatButtonModule, MatCheckboxModule,MatPaginatorModule,MatInputModule} from '@angular/material';
import {MatSortModule} from '@angular/material/sort';
...
@NgModule({
declarations: [...],
imports: [
MatSortModule,
MatTableModule,
MatPaginatorModule,
MatInputModule,
...
]
})
这是我的component.ts:
import { Component, OnInit , ViewChild, AfterViewInit} from '@angular/core';
...
import {MatTableDataSource,MatSort,MatPaginator} from '@angular/material';
...
export class MyClass inplements OnInit, AfterViewInit{
@ViewChild(MatSort) sort:MatSort;
@ViewChild(MatPaginator) paginator:MatPaginator;
...
ngAfterViewInit(){
this.dataSource = new MatTableDataSource(this.fake_data);
this.dataSource.paginator = this.paginator
this.dataSource.sort = this.sort
}
...
}
这是我的组件HTML:
<mat-form-field *ngIf="ready" class="width-80">
<input matInput (keyup)="applyFilter($event.target.value)" placeholder="Filter">
</mat-form-field>
<mat-table #table class = "mat-elevation-z8 animate" matSort [dataSource]="dataSource" display:flex>
<ng-container matColumnDef="fake_name">
<mat-header-cell *matHeaderCellDef mat-sort-header class="columnTitle"><b>{{fake_label.name}}</b></mat-header-cell>
<mat-cell *matCellDef="let fake;" class="cellContent">{{fake.name}}</mat-cell>
</ng-container>
<mat-header-row *matHeaderRowDef="fakeColumns"></mat-header-row>
<mat-row *matRowDef="let row; columns: fakeColumns" class="animate"></mat-row>
</mat-table>
<mat-paginator [length]="length" [pageSize]="5" [pageSizeOptions]="[5,10,15,20,25,50,100]" showFirstLastButtons></mat-paginator>
有谁知道我做错了什么?
答案 0 :(得分:4)
使用Angular 8和Material 6.4.1时,如果您等待从服务中接收数据的最简单,最好的方法是将其设置为 static:false ,而不是true,如下所示:< / p>
@ViewChild(MatSort,{ static:false })排序:MatSort;
就我而言是ngOnChanges数据调用。
仅供参考:与MatPaginator相同。
答案 1 :(得分:2)
问题可以通过添加到apps.module.ts中进行修复:
import { MatPaginatorModule } from '@angular/material';
和:
imports: [
....
MatSortModule
希望这会有所帮助。
答案 2 :(得分:1)
该问题是由于*ngIf="ready"
引起的。如果我们将其从父组件设置为ready
,则将datasource.sort
放在ngOnChanges
上,因为这是第一个被调用的生命周期挂钩:
ngOnChanges(){ this.datasource.sort = sort; this.datasource.paginator = paginator; }
或者,如果要在同一组件中更改ready
,则在设置就绪datasource.sort
之前放置false
:
ngOnInit(){ this.datasource.sort = sort; this.datasource.paginator = paginator; this.ready=false; }
最后,用一些默认值初始化datasource
,以使this.datasource
不会为null或未定义。
datasource=new MatTableDataSource([]);
答案 3 :(得分:0)
我遇到了同样的问题,并且找到了答案on a Angular's issue。
在我的特定情况下(以及该人在github上的情况),已解决了删除*ngIf
标记上的mat-table
的问题。我不确定,但也许<mat-form-field *ngIf="ready" class="width-80">
引起了一些麻烦。
答案 4 :(得分:0)
我的解决方案是:mat-sort-header="FIELDNAME"
,因为我的列包含“转换后的”数据。