我正在试验Angular material 表组件.由于某些原因,它没有在组件中呈现任何数据,这给了我一个错误:

找不到ID为"id"的列.

我无法理解这一点--我的数据中有一行的第id列.

我的内存中数据服务提供程序如下所示:

import { Injectable } from '@angular/core';
import { InMemoryDbService, RequestInfo } from 'angular-in-memory-web-api'
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class Contact {
  id!: string;
  name!: string;
  email!: string;

}

export class BackendService implements InMemoryDbService {

  constructor() { }
  createDb(reqInfo?: RequestInfo | undefined): {} | Observable<{}> | Promise<{}> {
    let contacts = [
      { id: 1, name: 'Contact 1', email: 'contact1@email.com' },
      { id: 2, name: 'Contact 2', email: 'contact2@email.com' },
      { id: 3, name: 'Contact 3', email: 'contact3@email.com' },
      { id: 4, name: 'Contact 4', email: 'contact4@email.com' }
    ];

    return { contacts };
  }
}

我的组件如下所示:

import { Component, OnInit, ViewChild } from '@angular/core';
import { ContactService } from '../contact.service';
import { firstValueFrom } from 'rxjs';
import { Contact } from '../backend.service';
import { MatTableDataSource } from '@angular/material/table';
import { MatPaginator } from '@angular/material/paginator';
import { MatSort } from '@angular/material/sort';

const COLUMNS_SCHEMA = [
  {
    key: "id",
    type: "text",
    label: "Id"
  },
  {
    key: "name",
    type: "text",
    label: "Name"
  },
  {
    key: "email",
    type: "text",
    label: "E-mail"
  },
]
@Component({
  selector: 'app-contact-list',
  templateUrl: './contact-list.component.html',
  styleUrl: './contact-list.component.css'
})
export class ContactListComponent implements OnInit {
  @ViewChild('paginator') paginator!: MatPaginator;
  @ViewChild(MatSort) sort!: MatSort;

  dataSource!: MatTableDataSource<Contact>;
  displayedColumns: string[] = COLUMNS_SCHEMA.map((col) => col.key);
  columnsSchema: any = COLUMNS_SCHEMA;

  contacts: any[] = [];
  constructor(private contactService: ContactService) {

  }
  async ngOnInit(): Promise<void> {

    const data: any = await firstValueFrom(this.contactService.getContacts());
    console.log(data);
    this.contacts = data;

    this.dataSource = new MatTableDataSource(this.contacts);
    this.dataSource.paginator = this.paginator;
    this.dataSource.sort = this.sort;
    console.log(this.displayedColumns);
  }
}

最后,我的模板如下所示:

<mat-table class="lessonlayui-table mat-elevation-z8" [dataSource]="dataSource">
  <ng-container matColumnDef="date">
    <mat-header-cell *matHeaderCellDef mat-sort-header> Id </mat-header-cell>
    <mat-cell *matCellDef="let contact">
      <input type="text" matInput [value]="contact.id" readonly>
    </mat-cell>
  </ng-container>

  <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>

  <mat-row *matRowDef="let row; columns: displayedColumns"></mat-row>

</mat-table>

推荐答案

该错误提到在您的<mat-table>中没有"id"的列定义.您必须按照displayColumns数组中提供的方式定义所有列.否则,从displayColumns数组中删除不需要的元素.

参考文献Define the column templates.

<mat-table class="lessonlayui-table mat-elevation-z8" [dataSource]="dataSource">
  <ng-container matColumnDef="id">
    <mat-header-cell *matHeaderCellDef mat-sort-header> Id </mat-header-cell>
    <mat-cell *matCellDef="let contact">
      <input type="text" matInput [value]="contact.id" readonly />
      {{ contact.id }}
    </mat-cell>
  </ng-container>

  <ng-container matColumnDef="name">
    <mat-header-cell *matHeaderCellDef mat-sort-header> Name </mat-header-cell>
    <mat-cell *matCellDef="let contact">
      <input type="text" matInput [value]="contact.name" readonly />
      {{ contact.name }}
    </mat-cell>
  </ng-container>

  <ng-container matColumnDef="email">
    <mat-header-cell *matHeaderCellDef mat-sort-header> Email </mat-header-cell>
    <mat-cell *matCellDef="let contact">
      <input type="text" matInput [value]="contact.email" readonly />
      {{ contact.email }}
    </mat-cell>
  </ng-container>

  <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>

  <mat-row *matRowDef="let row; columns: displayedColumns"></mat-row>
</mat-table>

Demo @ StackBlitz

Typescript相关问答推荐

如何准确确定此特定场景中的类型?

如何将http上下文附加到angular中翻译模块发送的请求

如何根据参数的值缩小函数内的签名范围?

如何在类型脚本中声明对象其键名称不同但类型相同?

如何在函数参数中使用(或模仿)`success`的行为?

在键和值为ARGS的泛型函数中未正确推断类型

泛型函数中输入参数类型的推断问题

隐式键入脚本键映射使用

TS2339:类型{}上不存在属性消息

等待用户在Angular 函数中输入

使用订阅时更新AG网格中的行

Select 下拉菜单的占位符不起作用

有没有可能产生输出T,它在视觉上省略了T中的一些键?

如何使所有可选字段在打印脚本中都是必填字段,但不能多或少?

为什么Typescript只在调用方提供显式泛型类型参数时推断此函数的返回类型?

17个Angular 的延迟观察.如何在模板中转义@符号?

VITEST警告:当前的测试运行器不支持After Each/teardown挂钩

如何使函数参数数组不相交?

使用RXJS获取数据的3种不同REST API

如何创建由一个帐户签名但使用另一个帐户支付的Hedera交易