Я прочитал некоторую документацию об API источника данных таблицы материалов Angular Документы API таблицы материалов , и они говорят следующее:
Источник данных таблицы, который может быть представлен тремя способами (в порядке сложности):
Простой массив данных (каждый объект представляет одну строку таблицы).
Поток, который выдает массив данных каждый раз, когда массив изменяется.
Объект DataSource, который реализует интерфейс подключения / отключения.
Вы можете использовать первый способ ( Простой массив данных).
Попробуйте сделать это, чтобы использовать простой массив данных вместо объекта matTableDataSource.
// use simple array instead of new MatTableDataSource()
// and define your interface later, for the moments we will use any
dataSource: any[] = [];
И здесь вам необходимо изменить метод подписки, чтобы назначить ответ на переменную dataSource, что теперь это простой массив.
initialiseTableData() {
this.sort.sortChange.subscribe(() => this.paginator.pageIndex = 0);
merge(this.sort.sortChange, this.paginator.page)
.pipe(
startWith({}),
switchMap(() => {
this.isLoadingResults = true;
return this.getCoins();
}),
map(data => {
console.info('data is an object!', data);
this.resultsLength = 0; // fix this later
this.isLoadingResults = false;
// here, data has total_count and items attributes?
// this.resultsLength = data.total_count;
// I think data is an object because you're getting
// an object as response, you're not getting a TableDataApi
// structure
return data;
}),
catchError(() => {
this.isLoadingResults = false;
return observableOf([]);
})
).subscribe(data => {
// data is an object, is not an array
// but your dataSource variable needs to be an array, so
// you have to add data into [] in order to create an array
// with your payload
this.dataSource = [data]; // <- assign data to dataSource
console.info('an array with my object', this.dataSource);
});
}
Теперь вы добавили интерфейс с элементами и атрибутами totalCount, я не знаю, почему вы это сделали, потому что ваш HTTP-запрос на самом деле имеет полезная нагрузка объекта, то есть это ваша полезная нагрузка, это объект. Этот объект не имеет атрибутов totalCount или items. Вы должны исправить свой интерфейс.
Ваша полезная нагрузка данных:
{"BTC":{"USD":8682.55,"EUR":7851.55},"ETH":{"USD":224.8,"EUR":203.77}}
Я пишу выше способ преобразования полезной нагрузки вашего объекта в массив, только добавьте ваш объект данных в [].
Удалите интерфейс и используйте любой для моментов, но позже вам нужно будет определить интерфейс с правильной структурой.
getCoins(): Observable<any> { // define interface with your correct structure
this.generateUrl();
return this.client.get<any>(this.urlComplete, this.httpHeader);
}