如何在组件表中显示来自API的数据?

时间:2019-04-11 15:35:31

标签: angular typescript angular-material

我正在将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

1 个答案:

答案 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