Как показать данные из API в таблице компонентов? - PullRequest
0 голосов
/ 11 апреля 2019

Я использую Angular с Material-Angular и хочу показать данные из Reqres API (https://reqres.in).. Поэтому я построил таблицу с нумерацией страниц, но моя нумерация страниц не работает.

Iсоздал сервис и модель для данных, которые я хочу сохранить, используя 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.htmlfile:

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

Поэтому, когда я меняю users на dataSource в html-файле: <table mat-table [dataSource]="HERE" class="mat-elevation-z8 table">, я не вижу результатов в своей таблице. Я думал, что dataSource хорошо объявлен,тип модели User и получение данных от users, но не работает. Если я переключаюсь на users, все отображаются очень хорошо, но мне нужно dataSource для нумерации страниц. Проблема в том, что данные не работаютсуществует в users во время звонка или как?

Использование: Angular-CLI 7

1 Ответ

0 голосов
/ 11 апреля 2019

Свяжите вашу директиву dataSource с объектом типа MatTableDataSource (не для пользователей), поскольку это поможет вам со всей сортировкой и разбиением на страницы.

  <table mat-table [dataSource]="dataSource" class="mat-elevation-z8 table">

Затем вам необходимо обновить объект MatTableDataSource, на который вы подписаны.к наблюдаемому (возвращаемому getUsers).

showUsers() {
this.page = 1;
this.dataService.getUsers(this.page)
  .subscribe(res => {
    this.datasource = new MatTableDataSource(res['data']);
  });

Другой альтернативой является использование метода renderRows.Это может быть полезно, если вы вызываете API несколько раз, так как он обновляет строки для новых изменений.

Вот официальный стек *: 1009 *https://stackblitz.com/edit/angular-mat-table-render-rows?file=app%2Ftable-filtering-example.ts

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...