我实现了一个从API检索信息的mat-table。
mat-table按预期显示数据。
mat-paginator无效。
在代码I下面使用:
组件:
import {DataService} from '../../services/data.service';
import {Component, ViewChild, AfterViewInit, OnInit} from '@angular/core';
import {MatPaginator, MatTableDataSource} from '@angular/material';
@Component({
selector: 'app-projects',
templateUrl: './projects.component.html',
styleUrls: ['./projects.component.css'],
})
export class ProjectsComponent implements OnInit,AfterViewInit {
projects: any;
dataSource = new MatTableDataSource();
displayedColumns: any;
length: number;
pageSize: number=1;
pageSizeOptions = [1, 5, 10, 50];
@ViewChild(MatPaginator) paginator: MatPaginator;
constructor(private dataService: DataService) {
}
ngOnInit() {
console.log("Retrieving projects");
this.getProjects().then(
projects => {
console.log("Projects retrieved", projects);
this.projects=projects;
this.dataSource = this.projects;
console.log(this.dataSource);
this.displayedColumns = [
'prj_id',
'title',
'priority_id'
];
this.length=this.projects.length;
}
).catch(function (data){
console.log("Rejected", data);
});
}
ngAfterViewInit() {
this.dataSource.paginator = this.paginator;
}
getProjects(){
let promise = new Promise((resolve, reject) => {
this.dataService.getProjects().subscribe(
projects => {
resolve(projects);
},
error => {
console.log("error retrieving projects");
reject("error retrieving projects");
}
)
});
return promise;
}
}
export interface Projects {
prj_id: string;
title: string;
priority_id: number;
}
HTML视图:
<div fxLayout="column" fxLayoutAlign="center center" >
<button mat-raised-button color="primary" ><mat-icon>add</mat-icon>Project</button>
</div>
<div fxLayout="row" fxLayoutWrap="wrap">
<div fxFlex.gt-sm="100" fxFlex.gt-xs="100" fxFlex="100">
<mat-card>
<mat-card-content>
<mat-card-title backgroundColor="primary">Projects</mat-card-title>
<div class="table-rasponsive">
<mat-table #table [dataSource]="dataSource">
<!-- Position Column -->
<ng-container matColumnDef="prj_id">
<mat-header-cell *matHeaderCellDef> ID </mat-header-cell>
<mat-cell *matCellDef="let element"> {{element.prj_id}} </mat-cell>
</ng-container>
<!-- Name Column -->
<ng-container matColumnDef="title">
<mat-header-cell *matHeaderCellDef> TITLE </mat-header-cell>
<mat-cell *matCellDef="let element"> {{element.title}} </mat-cell>
</ng-container>
<!-- Name Column -->
<ng-container matColumnDef="priority_id">
<mat-header-cell *matHeaderCellDef> PRIORITY </mat-header-cell>
<mat-cell *matCellDef="let element"> {{element.priority_id}} </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
[length]="length"
[pageSize]="pageSize"
[pageSizeOptions]="pageSizeOptions">
</mat-paginator>
</div>
</mat-card-content>
</mat-card>
</div>
</div>
答案 0 :(得分:2)
头痛很多之后,我确实找出了问题所在。 检查此行
this.dataSource = this.projects;
并用
进行更改this.dataSource.data = this.projects;
它应该可以解决您的问题。另外, ngAfterViewInit 还可以,请不要更改。
答案 1 :(得分:1)
如果您要从API提取数据,则该任务是异步的;这意味着即使未完成API请求,该任务也会调用下一步,如果您应用不带数据的分页器,则数据源中没有数据分页器肯定行不通。如果您使用console.log(this.paginator.paginator),则将无法定义,这意味着您的数据源未初始化,因此您无法将paginator应用于数据源
要使其正常运行,请务必在完成API请求后分别分配数据和分页器。
dataSource = new MatTableDataSource();
@ViewChild(MatPaginator) paginator: MatPaginator;
ngOnInit(){
yourService.getData().subscribe(
(data)=>{
this.datasource.data = data;
this.dataSource.paginator = this.paginator;
},
(error)=>{}
);
}
//请注意始终保持<mat-paginator> after <mat-table>
答案 2 :(得分:0)
试试这个:从ngAfterViewInit();
中删除代码ngAfterViewInit() {
this.dataSource.paginator = this.paginator;
}
并将其添加到ngOnInit();
中答案 3 :(得分:0)
请尝试按以下方式初始化MATPAGINATOR和MATSORT,这对我有用。
public dataSource = new MatTableDataSource([]);
@ViewChild(MatSort) matSort: MatSort;
private paginator: MatPaginator;
private sort: any;
@ViewChild(MatPaginator) set matPaginator(mp: MatPaginator) {
this.paginator = mp;
this.setDataSourceAttributes();
}
@ViewChild(MatSort) set content(content: ElementRef) {
this.sort = content;
if (this.sort) {
this.dataSource.sort = this.sort;
}
}
setDataSourceAttributes() {
this.dataSource.paginator = this.paginator;
this.dataSource.sort = this.sort;
}
以上代码检查分页器和排序变量,并且在未定义变量时将被设置。 另外,您无需在HTML文件中添加#paginator。
感谢和问候, Kishore Kumar。 K
答案 4 :(得分:0)
使用下面的行
this.dataSource = new MatTableDataSource(this.projects);
如果paginator仍然无法使用,对于动态加载的表格数据,请为MatPaginator使用read
参数
@ViewChild(MatPaginator, {read: true}) paginator: MatPaginator;
这将完成工作。