Таблица материалов Angular — как отобразить вложенные данные

У меня есть ответ REST API от URL-адреса, например:

{
  "list": [
    {
      "id": 1,
      "login": "[email protected]",
      "first_name": "AK",
      "phone": "967777777777"
    },
    {
      "id": 2,
      "login": "[email protected]",
      "first_name": "QR",
      "phone": "967777777777"
    },
    {
      "id": 3,
      "login": "[email protected]",
      "first_name": "JM",
      "phone": "967777777777"
    }
  ],
  "count": 3,
  "success": true
}

и я создал 2 интерфейса для этого API, например:

import { List } from "./list"

export interface Users {
    list: List[]
    count: number
    success: boolean
}
export interface List {
    id: number
    first_name: string
    login: string
    phone: string
}

и я создал службу для получения данных из URL-адреса API следующим образом:

getUsers(): Observable<Users[]>{
    //myHeader = myHeader.set('id', '123456');
    return this.http.get<Users[]>(`https://api.users.com/user/list`).pipe(
      tap(users => console.info(users)),
    );
}

и я назвал эту службу в своем component.ts следующим образом:

export class UsersComponent implements OnInit{
  displayedColumns: string[] = ['id', 'first_name', 'login', 'phone'];
  users: any[] = [];

  constructor(private usersService: UsersService){ }

  ngOnInit(): void {
    this.onGetUsers();
  }

  onGetUsers(): void{
    this.usersService.getUsers().subscribe(
      (response => {
        this.users = new MatTableDataSource<Users>(response);
      })
    );
  }
}

и просмотрите эти данные в таблице материалов следующим образом:

<table mat-table [dataSource] = "users" class = "mat-elevation-z8">
  
     Position Column 
    <ng-container matColumnDef = "id">
      <th mat-header-cell *matHeaderCellDef> ID </th>
      <td mat-cell *matCellDef = "let element"> {{element.id}} </td>
    </ng-container>

    <ng-container matColumnDef = "first_name">
      <th mat-header-cell *matHeaderCellDef> first_name </th>
      <td mat-cell *matCellDef = "let element"> {{element.first_name}} </td>
    </ng-container>
  
    <ng-container matColumnDef = "login">
      <th mat-header-cell *matHeaderCellDef> login </th>
      <td mat-cell *matCellDef = "let element"> {{element.login}} </td>
    </ng-container>
  
    <ng-container matColumnDef = "phone">
      <th mat-header-cell *matHeaderCellDef> phone </th>
      <td mat-cell *matCellDef = "let element"> {{element.phone}} </td>
    </ng-container>
  
    <tr mat-header-row *matHeaderRowDef = "displayedColumns"></tr>
    <tr mat-row *matRowDef = "let row; columns: displayedColumns;"></tr>
</table>

Но в таблице нет данных. Как я могу решить эту проблему?

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
1
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш ответ JSON представляет собой Users объект, а не Users массив.

  1. Измените getUsers из сервиса, чтобы он возвращал Observable типа Observable<Users>.
getUsers(): Observable<Users> {
  //myHeader = myHeader.set('id', '123456');
  return this.http
    .get<Users>(`https://yapi.yementrack.com.ye/panel/user/list`)
    .pipe(tap((users) => console.info(users)));
}
  1. Измените переменную users как тип MatTableDataSource<List>. (Рекомендуется переименовать переменную как userDatSource, но это необязательно)

  2. Вы должны присвоить значение response.list источнику данных users.

users!: MatTableDataSource<List>;

onGetUsers(): void {
  this.usersService.getUsers().subscribe((response) => {
    this.users = new MatTableDataSource<List>(response.list);
  });
}

Демо @ StackBlitz

Другие вопросы по теме