Estou estudando e atualmente estou com um projetinho simples onde eu tenho um back-end pronto de cursos e agora quero fazer o front. Ao tentar listar os meus cursos salvos na tela usando o material design table, estou recebendo o seguinte erro:
urses.component.html:4 ERROR Error: Provided data source did not match an array, Observable, or DataSource
at getTableUnknownDataSourceError (table.mjs:975:12)
at MatTable._observeRenderChanges (table.mjs:1700:19)
at MatTable.ngAfterContentChecked (table.mjs:1352:18)
at callHookInternal (core.mjs:3852:14)
at callHook (core.mjs:3883:9)
at callHooks (core.mjs:3834:17)
at executeInitAndCheckHooks (core.mjs:3784:9)
at refreshView (core.mjs:12530:21)
at detectChangesInView (core.mjs:12653:9)
at detectChangesInEmbeddedViews (core.mjs:12597:13)
O meu component esta da seguinte forma:
import { Component } from '@angular/core';
import { Course } from '../model/course';
import { CoursesService } from '../services/courses.service';
import { Observable, catchError, of } from 'rxjs';
import { MatDialog } from '@angular/material/dialog';
import { ErrorDialogComponent } from 'src/app/shared/components/error-dialog/error-dialog.component';
@Component({
selector: 'app-courses',
templateUrl: './courses.component.html',
styleUrls: ['./courses.component.scss']
})
export class CoursesComponent {
courses$: Observable<Course[]>; //meu datasource
displayedColumns = ['name', 'category']
constructor(public dialog: MatDialog,
private courseService: CoursesService) {
this.courses$ = this.courseService.list()
.pipe(
catchError(error => {
this.onError('Erro ao carregar cursos.');
return of([])
}),
);
}
onError(errorMsg: string) {
this.dialog.open(ErrorDialogComponent, {
data: errorMsg
});
}
}
Meu html:
<mat-toolbar color="primary">Cursos Disponíveis</mat-toolbar>
<mat-card class="example-spacer ">
<div *ngIf="courses$ | async as courses; else loading">
<table mat-table [dataSource] = "courses">
<ng-container matColumnDef="name">
<th mat-header-cell *matHeaderCellDef> Nome </th>
<td mat-cell *matCellDef="let course"> {{course.name}} </td>
</ng-container>
<ng-container matColumnDef="category">
<th mat-header-cell *matHeaderCellDef> Categoria </th>
<td mat-cell *matCellDef="let course"> {{course.category}} </td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>
</div>
<ng-template #loading>
<div class="loading-spinner">
<mat-spinner></mat-spinner>
</div>
</ng-template>
</mat-card>
O service:
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http'
import { Course } from '../model/course';
import { delay, first, tap } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class CoursesService {
private readonly API = 'api/cursos';
constructor(private httpClient: HttpClient) { }
list() {
return this.httpClient.get<Course[]>(this.API)
.pipe(
first(),
delay(5000),
tap(courses => console.log(courses))
);
}
}
O que esta errado em relação ao meu datasource que não carrega as minhas informações. Pelo erro aredito que não esta reconhecendo a minha variável como um array.... mas não faço ideia de como resolver