Как добавить загрузчик в мат-таблицу в angular

Код:

 <table  mat-table [dataSource] = "dataSource" matSort class = "table table-responsive">
        <tr mat-header-row *matHeaderRowDef = "displayedColumns"></tr>
                  <tr mat-row *matRowDef = "let row; columns: displayedColumns;"></tr>
                 
                   
                  <tr class = "mat-row" *matNoDataRow>
                    <td class = "mat-cell" [attr.colspan] = "displayedColumns.length">
                      No data to dislay.
                    </td>
                  </tr>
                </table>

здесь я добавил это для пустых данных, но есть ли какая-нибудь функция загрузки?? я получаю эти данные от API, так что это займет некоторое время. если данные ответа пусты, то мой приведенный выше код работает нормально, но я хочу то же самое с загрузчиком

Ваш вопрос не слишком ясен, плюс вам нужно указать функцию компонента в файле компонент.ts, что вы пробовали?

Derek Roberts 06.08.2024 09:02

вам нужен счетчик, почему вы ждете данных? или какой именно загрузчик?

Derek Roberts 06.08.2024 09:09
Тестирование функциональных 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
2
2
77
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я предполагаю, что вы хотите добавить счетчик во время извлечения данных из API.

Поскольку вы используете Material, я бы предложил использовать индикатор прогресса.

  1. Вам следует импортировать модуль

импортируйте {MatProgressSpinnerModule} из @angular/material/progress-spinner;

  1. затем добавьте его в ту часть вашего HTML, где вам нужен счетчик

источник: https://material.angular.io/comComponents/progress-spinner/overview

Это ты можешь попробовать

HTML

<table
  mat-table
  [dataSource] = "dataSource"
  matSort
  class = "table table-responsive"
  *ngIf = "!isLoading"
>
  <ng-container matColumnDef = "column1">
    <th mat-header-cell *matHeaderCellDef>Column 1</th>
    <td mat-cell *matCellDef = "let element">{{element.column1}}</td>
  </ng-container>

  <ng-container matColumnDef = "column2">
    <th mat-header-cell *matHeaderCellDef>Column 2</th>
    <td mat-cell *matCellDef = "let element">{{element.column2}}</td>
  </ng-container>

  <ng-container matColumnDef = "column3">
    <th mat-header-cell *matHeaderCellDef>Column 3</th>
    <td mat-cell *matCellDef = "let element">{{element.column3}}</td>
  </ng-container>

  <ng-container matColumnDef = "symbol">
    <th mat-header-cell *matHeaderCellDef>Column 3</th>
    <td mat-cell *matCellDef = "let element">{{element.symbol}}</td>
  </ng-container>

  <tr mat-header-row *matHeaderRowDef = "displayedColumns"></tr>
  <tr mat-row *matRowDef = "let row; columns: displayedColumns;"></tr>
  <tr class = "mat-row" *matNoDataRow>
    <td class = "mat-cell" [attr.colspan] = "displayedColumns.length">
      No data to display.
    </td>
  </tr>
</table>

<mat-card
  *ngIf = "isLoading"
  style = "display: flex; justify-content: center; align-items: center"
>
  <mat-progress-spinner color = "primary" mode = "indeterminate">
  </mat-progress-spinner>
</mat-card>

ТС

dataSource: any;

  isLoading = true;

  ngOnInit() {
    this.someService.getData()
      .subscribe(
        (data) => {
          console.info('data', data);
          this.isLoading = false;
          this.dataSource = data;
        },
        (error) => (this.isLoading = false)
      );
  }

Живая демонстрация

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

Я бы ничего не предполагал, поскольку контекст загрузчика не ясен. сначала вам придется изменить your.ts file. Хотя вам придется изменить тип данных «любой» на желаемый тип.

import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, of, catchError, map, startWith } from 'rxjs';

@Component({
  selector: 'app-your-component',
  templateUrl: './your-component.component.html',
  styleUrls: ['./your-component.component.css']
})
export class YourComponent implements OnInit {
  data$: Observable<any[]> = of([]);
  loading$: Observable<boolean> = of(true);

  displayedColumns: string[] = ['column1', 'column2', 'column3'];

  constructor(private http: HttpClient) { }

  ngOnInit() {
    this.data$ = this.http.get<any[]>('your-api-endpoint').pipe(
      map(data => {
        this.loading$ = of(false);
        return data;
      }),
      startWith([]), // Emits an empty array initially
      catchError(() => {
        this.loading$ = of(false);
        return of([]);
      })
    );
  }
}

Затем вам придется обновить свой html-файл с помощью этого.

    <table mat-table [dataSource] = "data$ | async" matSort class = "table table-responsive">
  <tr mat-header-row *matHeaderRowDef = "displayedColumns"></tr>
  <tr mat-row *matRowDef = "let row; columns: displayedColumns;"></tr>

  <!-- Loader Row -->
  <tr *ngIf = "(loading$ | async)" class = "mat-row">
    <td class = "mat-cell" [attr.colspan] = "displayedColumns.length" class = "loading-cell">
      <mat-spinner></mat-spinner>
    </td>
  </tr>

  <!-- No Data Row -->
  <tr *ngIf = "!(loading$ | async) && (data$ | async)?.length === 0" class = "mat-row">
    <td class = "mat-cell" [attr.colspan] = "displayedColumns.length">
      No data to display.
    </td>
  </tr>
</table>

Вы можете использовать этот код в качестве альтернативы для размещения счетчика в таблице.

</td>
<td class = "mat-cell" [attr.colspan] = "displayedColumns.length" *ngIf = "isLoading">
<mat-spinner diameter = "50"></mat-spinner>
</td>
</tr>

// это дополнительная опция, если вы хотите стилизовать контейнер с помощью CSS

.loader-container {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100%;
}

здесь, в этом случае, вместо таблицы отображается загрузчик, но я хочу отображать загрузчик внутри таблицы, например сообщение «данные не найдены».

Dishant Patel 07.08.2024 07:50

@DishantPatel Вы хотите, чтобы внутри таблицы отображалось «Нет данных для отображения»?

Derek Roberts 07.08.2024 08:07

если мой массив пуст, то я показываю «нет данных для отображения» <tr class = "mat-row" *matNoDataRow> <td class = "mat-cell" [attr.colspan] = "displayedColumns.length"> Нет данных для отображения. </td> </tr> вот так

Dishant Patel 07.08.2024 10:49

@DishantPatel Надеюсь, я понял вас сейчас: вы хотите, чтобы загрузчик запускался, если есть данные, а если данных нет, вы хотите отображать их, верно? Я обновил код html-файла, посмотрите, работает ли это.

Derek Roberts 07.08.2024 10:56

я тоже пробовал этот способ, но он не работает. вы можете видеть, что есть одна директива *matNoDataRow, она применима только в том случае, если вы получаете пустой массив в [dataSource], но в моем случае я вызываю один API, и через некоторое время он выдает данные, поэтому до тех пор я хочу отобразить загрузчик. но специальной директивы для загрузчика нет

Dishant Patel 07.08.2024 11:01

@DishantPatel вам нужен async , пока вы ждете данных, верно? Я обновил код.

Derek Roberts 07.08.2024 11:31

<!-- Нет строки данных --> эта часть уже работает. У меня проблема с тем, как разместить загрузчик внутри таблицы, пока API передает данные.

Dishant Patel 07.08.2024 13:44

просто поместите это <mat-spinner></mat-spinner> внутрь, где бы ни находился ваш стол.

Derek Roberts 07.08.2024 13:52

Давайте продолжим обсуждение в чате.

Dishant Patel 07.08.2024 14:55

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