You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular MatTable报错:数据源不匹配数组/Observable/DataSource求助

问题:Angular MatTable报错“provided data source did not match an array, Observable or DataSource”

通过MongoDB集合的聚合查询获取数据生成报表,在Angular中使用MatTable时遇到上述错误。

数据库返回数据

{
  vitems: [
    { itemQty: -19, count: 3, itemCode: '333.5.23' },
    { itemQty: -24, count: 4, itemCode: '113.77.33' },
    { itemQty: -28, count: 5, itemCode: '77.34.565' },
    { itemQty: -18, count: 3, itemCode: '7611' }
  ]
}

TS文件代码

import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core';
import { MasterService } from '../master.service';
import { MatTableModule, MatTable, MatTableDataSource} from '@angular/material/table'
import { environment } from '../../environments/environment.development';
import { VItem } from '../vitem';


interface Nitem {
              itemQty : number,
              count : number,
              itemCode : string
}


@Component({
  selector: 'app-stock',
  templateUrl: './stock.component.html',
  styleUrl: './stock.component.css'
})
export class StockComponent implements OnInit{

  masterUrl = environment.domain + 'invoices/stock';
  stockItems : Nitem[];
  displayedColumns: string[] = ['itemCode', 'itemQty'];
  
  @ViewChild(MatTable, {static:true}) table!: MatTable<any>;
  
  constructor(private masterService : MasterService){}

  ngOnInit(): void {
    this.masterService.getMasters(this.masterUrl)
    .subscribe(data => {
      this.stockItems = data;
    });
  }
  
}

HTML文件代码

<div  class="container text-center">
          
    <table mat-table [dataSource]="stockItems" #mytable class="my-table mat-elevation-z8">
      
      <ng-container matColumnDef="itemCode">
        <th mat-header-cell *matHeaderCellDef> Item Code</th>
        <td mat-cell *matCellDef="let element"> {{element.itemCode}} </td>
      </ng-container>
  
      <ng-container matColumnDef="itemQty">
        <th mat-header-cell *matHeaderCellDef> Stock</th>
        <td mat-cell *matCellDef="let element"> {{element.itemQty}} </td>
      </ng-container>
  
      <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
      <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
    </table>
  
  </div>

解决方案

1. 修正数据赋值逻辑

报错核心原因是后端返回的是包含数组的对象,但代码直接将整个对象赋值给了stockItems,MatTable要求数据源必须是数组、Observable或DataSource类型。

修改ngOnInit中的赋值逻辑,提取对象里的vitems数组:

ngOnInit(): void {
  this.masterService.getMasters(this.masterUrl)
  .subscribe(data => {
    // 提取vitems数组赋值给stockItems
    this.stockItems = data.vitems;
  });
}

2. 推荐使用MatTableDataSource(可选)

如果需要使用MatTable的筛选、分页、排序等功能,建议使用MatTableDataSource封装数据:

修改TS代码:

// 新增数据源定义
dataSource = new MatTableDataSource<Nitem>();

ngOnInit(): void {
  this.masterService.getMasters(this.masterUrl)
  .subscribe(data => {
    this.dataSource.data = data.vitems;
  });
}

修改HTML代码:

将[dataSource]绑定改为dataSource:

<table mat-table [dataSource]="dataSource" #mytable class="my-table mat-elevation-z8">

这样既解决了报错问题,也能更好地利用MatTable的内置功能。

内容的提问来源于stack exchange,提问作者Manickam Parameswaran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 12:12:20