Как отобразить данные из API в таблице компонентов?

#angular #typescript #angular-material

#angular #typescript #angular-материал

Вопрос:

Я использую 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>
  

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

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

Ответ №1:

Привяжите свою директиву DataSource к объекту типа MatTableDataSource (не users), поскольку это поможет вам со всей сортировкой и нумерацией страниц.

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

Вот официальный stackbitz: https://stackblitz.com/edit/angular-mat-table-render-rows?file=app/table-filtering-example.ts

Комментарии:

1. О, это помогло. Спасибо, но что мне делать с dataSource приведенным выше объявлением конструктора?

2. Рад помочь. Таблица Mat не выдает ошибку, если источник данных не определен, а показывает пустую таблицу. Вы можете либо оставить все как есть, либо просто объявить источник данных с типом, не инициализируя его. И, пожалуйста, примите ответ, если он решил проблему. 🙂