使用 REST API 时 mat-table 数据源不起作用

Posted

技术标签:

【中文标题】使用 REST API 时 mat-table 数据源不起作用【英文标题】:mat-table dataSource doesn't work when using REST API 【发布时间】:2020-01-25 09:48:25 【问题描述】:

我无法将数据放入材料表中。

我创建了一个 Block 模型,其中包含 iddate 等字段。data.service 是 API 调用所在,函数 getAllBlock() 返回块。我在app.component.html 中尝试过,它可以工作。

document-list.component.ts

import  Component, OnInit  from '@angular/core';
import  MatTableDataSource  from '@angular/material/table';
import  DataService  from '../data.service';
import  Block  from '../models/block.model';

@Component(
    selector: 'app-document-list',
    templateUrl: './document-list.component.html',
    styleUrls: ['./document-list.component.sass']
)
export class DocumentListComponent implements OnInit 
    blocks: Block[];
    //DataSource and columns for DataTable
    displayedColumns: string[] = ['Id', 'Date', 'Data', 'Hash', 'PreviousHash'];
    dataSource = new MatTableDataSource<Block>(this.blocks);

    //Filter (search)
    applyFilter(filterValue: string) 
        this.dataSource.filter = filterValue.trim().toLowerCase();
    

    constructor(private dataService: DataService)  

    ngOnInit()
        return this.dataService.getAllBlock()
        .subscribe(data => this.blocks = data);
    

document-list.component.html

<div class="content-table">
    <mat-form-field>
        <input matInput (keyup)="applyFilter($event.target.value)" placeholder="Filter">
    </mat-form-field>

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

        <!-- Date Column -->
        <ng-container matColumnDef="Date">
            <th mat-header-cell *matHeaderCellDef>Timestamp</th>
            <td mat-cell *matCellDef="let element"> element.Date </td>
        </ng-container>

        <!-- Data Column -->
        <ng-container matColumnDef="Data">
            <th mat-header-cell *matHeaderCellDef>Data</th>
            <td mat-cell *matCellDef="let element"> element.Data </td>
        </ng-container>

        <!-- Hash Column -->
        <ng-container matColumnDef="Hash">
            <th mat-header-cell *matHeaderCellDef>Hash</th>
            <td mat-cell *matCellDef="let element"> element.Hash </td>
        </ng-container>

        <!-- Previous Hash -->
        <ng-container matColumnDef="PreviousHash">
            <th mat-header-cell *matHeaderCellDef>PrevHash</th>
            <td mat-cell *matCellDef="let element"> element.PreviousHash </td>
        </ng-container>
        <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
        <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
    </table>
</div>

我不知道如何向表中插入数据。我所做的有什么问题或问题出在哪里?

【问题讨论】:

用这个答案试试它的类似问题***.com/questions/54575692/… 【参考方案1】:

您正在处理异步数据,所以最初this.blocksundefined。您需要在订阅getAllBlock() 之后定义this.blocks 后创建dataSource。在这里使用return 也没有意义,因为您只是从subscribe 方法中获取数据。因此,只需调用 getAllBlock() 即可。

您的代码现在应该是这样的。

dataSource: MatTableDataSource<Block>;

ngOnInit() 
    this.dataService.getAllBlock().subscribe(data => 
        this.blocks = data
        this.dataSource = new MatTableDataSource<Block>(this.blocks);
    );

【讨论】:

这个答案帮助我解决了我的问题。我花了几个小时才弄清楚。谢谢! 它对我有用

以上是关于使用 REST API 时 mat-table 数据源不起作用的主要内容,如果未能解决你的问题,请参考以下文章

mat-table 不会从 api 加载值。 Api 工作正常

如何比较来自api的jobId和角度材料中的mat-table

使Angular mat-table中的行数长于dataSource的长度

将参数发布到 Rest API

如何获取 Watson NLU 使用的 API 事务数?

用于非授权连接的 Spring Security REST Api