我正在将Angular与Material-Angular结合使用,我想显示来自Reqres API(https://reqres.in)的数据。所以我用分页建立了一个表,但是我的分页不起作用。
我当然使用HttpClient为要保留的数据创建了服务和模型。在组件类中,我创建了两个变量来保留此数据:
users: User[]
和dataSource = new MatTableDataSource<User>(this.user)
。
import { Component, OnInit, ViewChild } from '@angular/core';
import { User } from '../config/user.module';
import { DataService } from '../data.service';
import { MatPaginator, MatTableDataSource } from '@angular/material';
@Component({
selector: 'app-users-list',
templateUrl: './users-list.component.html',
styleUrls: ['./users-list.component.sass']
})
export class UsersListComponent implements OnInit {
users: User[];
page: number;
displayedColumns = ['Id', 'FirstName'];
dataSource = new MatTableDataSource<User>(this.users);
constructor(private dataService: DataService) { }
@ViewChild(MatPaginator) paginator: MatPaginator;
ngOnInit() {
this.dataSource.paginator = this.paginator;
this.showUsers();
}
showUsers() {
this.page = 1;
this.dataService.getUsers(this.page)
.subscribe(res => {
this.users = res['data'];
});
}
}
还有我的template.html文件:
<section class="list">
<table mat-table [dataSource]="users" class="mat-elevation-z8 table">
<ng-container matColumnDef="Id">
<th mat-header-cell *matHeaderCellDef>
<span class="table-header">No.</span>
</th>
<td mat-cell *matCellDef="let user">
<span class="table-value">{{user.id}}</span>
</td>
</ng-container>
<ng-container matColumnDef="FirstName">
<th mat-header-cell *matHeaderCellDef>
<span class="table-header">Name</span>
</th>
<td mat-cell *matCellDef="let user">
<span class="table-value">{{user.first_name}}</span>
</td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>
<mat-paginator [pageSizeOptions]="[3]" showFirstLastButtons></mat-paginator>
</section>
因此,当我在HTML文件users
的{{1}}上更改dataSource
时,在表中看不到任何结果。
我认为<table mat-table [dataSource]="HERE" class="mat-elevation-z8 table">
声明得很好,是dataSource
模型的类型,并且可以从User
获取数据,但是不起作用。如果我在users
上进行了更改,则所有显示都很好,但是我需要users
进行分页。问题是时间,在调用时dataSource
中不存在数据还是什么?
使用:Angular-CLI 7
答案 0 :(得分:0)
将您的dataSource指令绑定到MatTableDataSource类型的对象(而非用户),因为它将帮助您进行所有排序和分页。
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8 table">
然后,您需要更新已预订可观察对象(由getUsers返回)的MatTableDataSource对象。
showUsers() {
this.page = 1;
this.dataService.getUsers(this.page)
.subscribe(res => {
this.datasource = new MatTableDataSource(res['data']);
});
其他替代方法是使用renderRows方法。如果您多次调用API,可能会有所帮助,因为它会为新更改更新行。
这是官方的stackbitz:https://stackblitz.com/edit/angular-mat-table-render-rows?file=app%2Ftable-filtering-example.ts