请告诉我为什么我在材料表中看不到数据。我只是听不懂。数据实际上是。行数与实际数据量相对应,但是表只是空的。
device.model.ts
export class DeviceModel {
private _id: number;
private _device: string;
private _status: string;
private _lastUpdate: Date;
contructor(id?: number,
device?: string,
status?: string,
lastUpdate?: Date) {
this._id = id;
this._device = device;
this._status = status;
this._lastUpdate = lastUpdate;
}
get id(): number {
return this._id;
}
set id(value: number) {
this._id = value;
}
get device(): string {
return this._device;
}
set device(value: string) {
this._device = value;
}
get status(): string {
return this._status;
}
set status(value: string) {
this._status = value;
}
get lastUpdate(): Date {
return this._lastUpdate;
}
set lastUpdate(value: Date) {
this._lastUpdate = value;
}
}
device.service.ts
import {Injectable} from '@angular/core';
import {HttpClient} from "@angular/common/http";
import {Observable, of} from "rxjs";
import {AppConfig} from "../../../config/app.config";
import {DeviceModel} from "./device.model";
import {LoggerService} from "../../../core/shared/logger.service";
import {catchError, tap} from "rxjs/operators";
@Injectable({
providedIn: 'root'
})
export class DeviceService {
private readonly deviceUrl: string;
constructor(private httpClient: HttpClient) {
this.deviceUrl = AppConfig.endpoints.device;
}
private static handleError<T>(operation = 'operation', result?: T) {
return (error: any): Observable<T> => {
// TODO: send the error to remote logging infrastructure
console.error(error); // log to console instead
// TODO: better job of transforming error for user consumption
LoggerService.log(`${operation} failed: ${error.message}`);
if (error.status >= 500) {
throw error;
}
return of(result as T);
};
}
public getAllDevices(): Observable<DeviceModel[]> {
return this.httpClient.get<DeviceModel[]>(this.deviceUrl)
.pipe(
tap(() => LoggerService.log(`fetched devices`)),
catchError(DeviceService.handleError('getDevices', []))
);
}
}
device-list.component.ts
import {Component, OnInit} from '@angular/core';
import {DeviceModel} from "../../shared/device.model";
import {DeviceService} from "../../shared/device.service";
@Component({
selector: 'app-device',
templateUrl: './device-list.component.html',
styleUrls: ['./device-list.component.scss']
})
export class DeviceListComponent implements OnInit {
devices: DeviceModel[];
displayedColumns: ['id', 'device', 'state', 'lastUpdate'];
constructor(private deviceService: DeviceService) {
}
ngOnInit() {
this.deviceService.getAllDevices().subscribe((devices: DeviceModel[]) => {
this.devices = devices
});
console.log(this.devices);
}
}
device-list.components.html
<!-- Table container-->
<div class="table-container">
<mat-table #deviceTable [dataSource]="devices">
<!-- Id Column -->
<ng-container matColumnDef="id">
<mat-header-cell *matHeaderCellDef> Id </mat-header-cell>
<mat-cell *matCellDef="let device">{{device.id}}</mat-cell>
</ng-container>
<!-- Device Column -->
<ng-container matColumnDef="device">
<mat-header-cell *matHeaderCellDef> Device </mat-header-cell>
<mat-cell *matCellDef="let device">{{device.device}}</mat-cell>
</ng-container>
<!-- Status Column -->
<ng-container matColumnDef="state">
<mat-header-cell *matHeaderCellDef> State </mat-header-cell>
<mat-cell *matCellDef="let device">{{device.state}}</mat-cell>
</ng-container>
<!-- Lst update Column -->
<ng-container matColumnDef="lastUpdate">
<mat-header-cell *matHeaderCellDef> Last update </mat-header-cell>
<mat-cell *matCellDef="let device">{{device.lastUpdate}}</mat-cell>
</ng-container>
<mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
<mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
</mat-table>
</div>
<!-- Table container-->
如果将结果显示在普通的html表中-则有数据。
<div>
<table>
<thead>
<tr>
<th>Id</th>
<th>DeviceModel</th>
<th>State</th>
<th>Last update</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let device of devices">
<td>{{device.id}}</td>
<td>{{device.device}}</td>
<td>{{device.status}}</td>
<td>{{device.lastUpdate}}</td>
</tr>
</tbody>
</table>
</div>
我怀疑DeviceService中的数据映射错误。但是我只是不明白怎么了。我还将日志内容附加在浏览器控制台(Chrome浏览器)中。
通常,您已经可以看到设备阵列未定义。 您能告诉我如何解决此问题吗?
答案 0 :(得分:1)
我设法解决了这个问题。我的主要错误-我使用常规数组作为MaterialTable的数据源,而我必须传递MaterialTableDataSource实例。另外,作为标题,我使用了错误初始化的数组。
device-list.component.ts
import {Component, OnInit} from '@angular/core';
import {Device} from "../../shared/device.model";
import {DeviceService} from "../../shared/device.service";
import {MatTableDataSource} from "@angular/material";
@Component({
selector: 'app-device',
templateUrl: './device-list.component.html',
styleUrls: ['./device-list.component.scss']
})
export class DeviceListComponent implements OnInit {
dataSource = new MatTableDataSource<Device>();
displayedColumns: ReadonlyArray<string> = [
'id',
'device',
'state',
'lastUpdate'
];
constructor(private deviceService: DeviceService) {
}
ngOnInit() {
this.deviceService.getAllDevices().then((devices: Device[]) => {
this.dataSource.data = devices;
});
}
}