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

Angular Material表格无法显示Firebase数据求助

问题:Angular Material表格无法渲染Firebase获取的数据

我正在学习结合Firebase数据库的Angular Material开发,尝试获取Firebase中的所有数据,但数据无法在Material表格中显示。控制台打印确认已成功获取数据,却无法在HTML页面渲染。已参照表格文档操作,但问题仍存在。

原始HTML代码

<mat-form-field>
  <mat-label>Filter</mat-label>
  <input matInput (keyup)="applyFilter($event)" placeholder="Ex. Mia" #input>
</mat-form-field>
    
<div class="mat-elevation-z8">
  <table mat-table [dataSource]="dataSource" matSort>
  
    <!-- ID Column -->
    <ng-container matColumnDef="id">
       <th mat-header-cell *matHeaderCellDef mat-sort-header> ID </th>
       <td mat-cell *matCellDef="let row"> {{row.id}} </td>
    </ng-container>
  
     <!-- First Name Column -->
    <ng-container matColumnDef="firstName">
       <th mat-header-cell *matHeaderCellDef mat-sort-header> First Name </th>
      <td mat-cell *matCellDef="let row"> {{row.firstName}}% </td>
    </ng-container>
  
     <!-- Last Name Column -->
    <ng-container matColumnDef="lastName">
      <th mat-header-cell *matHeaderCellDef mat-sort-header> Last Name </th>
       <td mat-cell *matCellDef="let row"> {{row.lastName}} </td>
     </ng-container>
  
     <!-- Email Column -->
     <ng-container matColumnDef="email">
       <th mat-header-cell *matHeaderCellDef mat-sort-header> Email </th>
       <td mat-cell *matCellDef="let row"> {{row.email}} </td>
     </ng-container>
  
     <!-- Mobile Column -->
     <ng-container matColumnDef="mobile">
       <th mat-header-cell *matHeaderCellDef mat-sort-header> Mobile </th>
       <td mat-cell *matCellDef="let row"> {{row.mobile}} </td>
    </ng-container>

      <!-- BMI Result Column -->
    <ng-container matColumnDef="bmiResult">
      <th mat-header-cell *matHeaderCellDef mat-sort-header> BMI </th>
      <td mat-cell *matCellDef="let row"> {{row.bmiResult}} </td>
    </ng-container>

     <!-- Gender Column -->
      <ng-container matColumnDef="gender">
      <th mat-header-cell *matHeaderCellDef mat-sort-header> Gender </th>
      <td mat-cell *matCellDef="let row"> {{row.gender}} </td>
    </ng-container>

    <!-- Membership Column -->
    <ng-container matColumnDef="membership">
      <th mat-header-cell *matHeaderCellDef mat-sort-header> Membership </th>
      <td mat-cell *matCellDef="let row"> {{row.membership}} </td>
    </ng-container>

    <!-- Start Date Column -->
    <ng-container matColumnDef="startDate">
      <th mat-header-cell *matHeaderCellDef mat-sort-header> Start Date </th>
      <td mat-cell *matCellDef="let row"> {{row.startDate | date}} </td>
    </ng-container>

    <!-- Action Column -->
    <ng-container matColumnDef="action">
      <th mat-header-cell *matHeaderCellDef mat-sort-header> Action </th>
      <td mat-cell *matCellDef="let row"> 
        <button>View</button>
        <button>Edit</button> 
        <button>Delete</button>
      </td>
    </ng-container>

    <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
    <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
  
    <!-- Row shown when there is no matching data. -->
    <tr class="mat-row" *matNoDataRow>
      <td class="mat-cell" colspan="4">No data matching the filter "{{input.value}}"</td>
      </tr>
  </table>
  <mat-paginator [pageSizeOptions]="[5, 10, 25, 100]" aria-label="Select page of users"></mat-paginator>
</div>

原始TS代码

export class RegistrationListComponent implements OnInit {
  
public users!: User[];
public dataSource!: MatTableDataSource<User>;

@ViewChild(MatPaginator) paginator!: MatPaginator;
@ViewChild(MatSort) matsort!: MatSort;
displayedColumns: string[] = ['id','firstName', 'lastName', 'email', 'mobile', 'bmiResult', 
  'gender', 'membership', 'startDate', 'action']

constructor(private api: ApiService){}

ngOnInit() {
  this.getUsers();
    
}
getUsers(){

this.api.getRegisteredUser().subscribe(result =>{
  if(!result){
    return;
  }
    this.dataSource = new MatTableDataSource(this.users);
    this.dataSource.paginator = this.paginator;
    this.dataSource.sort = this.matsort;
    console.log(result)
  });
}

applyFilter(event: Event) {
  const filterValue = (event.target as HTMLInputElement).value;
  this.dataSource.filter = filterValue.trim().toLowerCase();

  if (this.dataSource.paginator) {
    this.dataSource.paginator.firstPage();
  }
 }
}

解决方案

核心问题

你没有将Firebase返回的result赋值给this.users,而是直接使用未初始化的this.users创建MatTableDataSource,导致数据源为空。此外还有两处细节需要调整:

修正后的TS代码

export class RegistrationListComponent implements OnInit, AfterViewInit {
  
public users!: User[];
public dataSource!: MatTableDataSource<User>;

@ViewChild(MatPaginator) paginator!: MatPaginator;
@ViewChild(MatSort) matsort!: MatSort;
displayedColumns: string[] = ['id','firstName', 'lastName', 'email', 'mobile', 'bmiResult', 
  'gender', 'membership', 'startDate', 'action']

constructor(private api: ApiService){}

ngOnInit() {
  this.getUsers();
}

// 确保分页器和排序组件初始化完成后再绑定
ngAfterViewInit() {
  if (this.dataSource) {
    this.dataSource.paginator = this.paginator;
    this.dataSource.sort = this.matsort;
  }
}

getUsers(){
  this.api.getRegisteredUser().subscribe(result =>{
    if(!result){
      return;
    }
    // 将Firebase返回的数据赋值给users变量
    this.users = result;
    // 使用赋值后的users创建数据源
    this.dataSource = new MatTableDataSource(this.users);
    // 若视图已初始化,直接绑定分页器和排序
    if (this.paginator && this.matsort) {
      this.dataSource.paginator = this.paginator;
      this.dataSource.sort = this.matsort;
    }
    console.log(result)
  });
}

applyFilter(event: Event) {
  const filterValue = (event.target as HTMLInputElement).value;
  this.dataSource.filter = filterValue.trim().toLowerCase();

  if (this.dataSource.paginator) {
    this.dataSource.paginator.firstPage();
  }
 }
}

修正后的HTML细节

无数据行的colspan值需要与列数一致(当前为10列),避免布局错乱:

<tr class="mat-row" *matNoDataRow>
  <td class="mat-cell" colspan="10">No data matching the filter "{{input.value}}"</td>
</tr>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 05:17:02