Mat-table 的行具有不同的子行数

2024-03-23

尝试使用mat-table指令,例如*matRowDef and multiTemplateDataRows构建一个表,其中每行可以有不同数量的子行。

示例界面如下所示:

interface ReportCard {
  student: string;
  reports: Report[];
}

interface Report {
  class: string;
  teacher: string;
  grade: string;
}

...没有固定数量的报告。

我可以轻松地构建一个表*ngFor,但我想使用内置的材质表指令。

<table>
  <thead>
    <tr>
      <th>student</th>
      <th colspan="3">
        classes
      </th>
    </tr>
    <tr>
      <th></th>
      <th>name</th>
      <th>teacher</th>
      <th>grade</th>
    </tr>
  </thead>
  <tbody>
    <ng-container *ngFor="let reportCard of reportCards">
      <tr
        *ngFor="let report of reportCard.reports; let first = first"
      >
        <td
          *ngIf="first"
          [attr.rowspan]="reportCard.reports.length"
        >
          {{ reportCard.student }}
        </td>
        <td>{{ report.class }}</td>
        <td>{{ report.teacher }}</td>
        <td>{{ report.grade }}</td>
      </tr>
    </ng-container>
  </tbody>
</table>

我想我还可以使用以下命令为数据行创建任意数量的模板multiTemplateDataRows处理每个报告(类似于这个答案 https://stackoverflow.com/a/74673290/2088345),但这似乎不是最好的解决方案。另外,我不确定在尝试填充时是否能够访问每个报告的正确索引<td>具有正确数据的单元格。

我正在尝试构建的表的 Stackblitz https://stackblitz.com/edit/angular-ibcmee?file=src%2Fapp%2Ftable-basic-example.html,src%2Fapp%2Ftable-basic-example.ts,src%2Fapp%2Ftable-basic-example.css

任何帮助表示赞赏。


我建议在将数据用作数据源之前,将数据转换为包含报告卡及其报告的平面数组。对于您的具体情况,这将是最简单且最容易理解的。

@Component({
  selector: 'table-basic-example',
  styleUrls: ['table-basic-example.css'],
  templateUrl: 'table-basic-example.html',
})
export class TableBasicExample implements OnInit {
  
  private reportCards = REPORT_DATA;
  
  public reportCardColumns: string[] = ['reportCard.student'];
  public reportColumns: string[] = ['report.class', 'report.grade', 'report.teacher'];
  public dataSource: Array<ReportCard|Report>;
  

  public ngOnInit(): void {
    const data: Array<ReportCard|Report> = [];
    for (let reportCard of REPORT_DATA) {
      data.push(reportCard, ...reportCard.reports);
    }
    this.dataSource = data; 
  }

  public isReportCard(index: number, data: ReportCard|Report): boolean {
    return Reflect.has(data, 'reports');
  }
  
  public isReport(index: number, data: ReportCard|Report): boolean {
    return !Reflect.has(data, 'reports');
  }
}

在您的模板中,您现在可以简单地使用两个 when 谓词及其自己的列和 css 类:

<tr mat-header-row *matHeaderRowDef="reportColumns" ></tr>
<tr mat-row *matRowDef="let row; columns: reportCardColumns; when: isReportCard" class="reportCard"></tr>
<tr mat-row *matRowDef="let row; columns: reportColumns; when: isReport" class="report"></tr>

你可以找到这里有一个正在运行的 StackBlitz https://stackblitz.com/edit/angular-ibcmee-u3wxjp?file=src/app/table-basic-example.ts.

Update:

补充意见后这是另一个 Stackblitz https://stackblitz.com/edit/angular-ibcmee-3a2oux?file=src/app/table-basic-example.ts这正是原始问题中所要求的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mat-table 的行具有不同的子行数 的相关文章

随机推荐

  • 两个 Perl 脚本之间的 cgi 会话

    我在我的网站中使用了两个 Perl 脚本 我在侧面有一个搜索字段 它调用第一个脚本 结果写入输出文件中 下一次单击时 用户调用第二个脚本 该脚本读取输出文件并根据用户搜索构建配置文件 目前我只在输出文件上写入 但我需要使用会话 ID 来个性
  • 文字运算符模板:为什么不是字符串?

    再次 在回答另一个问题时 我忘记了 我的错 仅当找到整数或浮点文字时 才会从声明集中选取文字运算符模板 举个例子 template
  • 节点/fastify 出现错误,不支持的媒体类型:application/x-www-form-urlencoded

    index js fastify get paynow request reply gt let data TXN AMOUNT 10 request amount ORDER ID ORDER 123455 any unique orde
  • 如何在 MacOS Sierra 上安装 pymssql

    Command usr bin python u c import setuptools tokenize file private tmp pip build J1I0ox pymssql setup py f getattr token
  • IEnumerator 移回记录

    我有一个要求 我必须有记录来回 所以我使用 IEnumerator 来实现这一点 但我可以通过 movenext 前进 但无法后退 这是一种可以包装的方法IEnumerator
  • Rails,在form_for标签自定义文本中插入span标签

    我的问题是我想插入一个 span tag in form for label自定义文本 在正常的 html 代码中 它会是这样的 span
  • FBSDKGraphRequest 使用未声明的标识符

    虽然我已经导入了 FacebookSDK 例如 import
  • 403 - 禁止:访问被拒绝。 ASP.Net MVC [重复]

    这个问题在这里已经有答案了 可能的重复 IIS 7 中的 ASP MVC 导致 HTTP 错误 403 14 禁止 https stackoverflow com questions 1741439 asp mvc in iis 7 res
  • 用 INSERT / UPDATE 的单个查询替换循环

    我正在 PostgreSQL 中编写一个函数 它基本上执行 3 个步骤 从源表中获取一条记录 检查目标表中提取的记录的值 如果在目标表中找到记录 则使用提取的记录更新目标表的所有值 否则将提取的记录插入目标表 如果我写 而不是做这个循环单一
  • 防止多次点击按钮

    我有以下 jQuery 代码来防止双击按钮 效果很好 我在用Page ClientValidate 确保仅当页面有效时才阻止双击 如果存在验证错误 则不应设置标志 因为没有启动到服务器的回发 有没有更好的方法来防止在页面加载回来之前第二次单
  • 无法创建新的 Chrome 远程会话

    我正在尝试使用 Selenium Grid 启动新的 Chrome 浏览器 但最终出现以下错误 无法创建新的远程会话 所需功能 功能 browserName chrome version 55 0 2 platform WINDOWS 所需
  • 如何重命名 Excel 工作表?

    我有一个场景 我想更改电子表格中工作表的名称 我尝试使用创建电子表格ss Workbook 我认为这是用名为 Sheet 的工作表创建电子表格 我尝试使用以下格式更改工作表的名称 ss sheet ss get sheet by name
  • Realm 将数据追加到类型 List

    我正在尝试遍历数据并将其保存在我的模型中 但是无论我做什么 我都会收到以下错误 Can t mutate a persisted array outside of a write transaction 我究竟做错了什么 我将每场比赛附加到
  • “文本”和 new String(“文本”) 有什么区别?

    下面这两个陈述有什么区别 String s text String s new String text new String text 显式创建一个新的且引用不同的实例String目的 String s text 可以重用来自的实例字符串常
  • Coldfusion autosuggest 不适用于字符串中间的建议

    对于我的自动建议 我使用下面的代码 输入时 它只查看字符串的开头 例如 如果我输入 abcd 它会附带建议 abcde 这很好 但它没有做什么 如果我输入 def 并且在数据库中我有一个字符串 abcdefg 那么它不会出现在自动建议中 在
  • 在 CellTable 中添加并排序的行

    我想在添加新行时对 CellTable 中的行进行排序 为了标记 UI 我使用 UIBinder
  • 如何在浏览器中读取本地文本文件?

    我试图通过创建一个函数来实现一个简单的文本文件阅读器 该函数接受文件的路径并将每行文本转换为字符数组 但它不起作用 function readTextFile var rawFile new XMLHttpRequest rawFile o
  • 在 php 中,我应该在通常返回数组的方法中返回 false、null 或空数组吗?

    我发现了一些对此的回应 但没有一个与 PHP 这是一种极其弱类型的语言 有关 关于PHP 在通常会返回数组但发生失败的方法中返回 false null 或空数组是否合适 换句话说 如果另一个开发人员加入我的项目 他们会期望看到什么 数组是事
  • 更新以前的会话数组 Laravel

    我有一个问题 如何更新我以前的数组 我的代码目前发生的情况是它只是添加新的会话数组 而不是更新声明的密钥 这是我的代码 foreach items updated as key gt added if id added item id ne
  • Mat-table 的行具有不同的子行数

    尝试使用mat table指令 例如 matRowDef and multiTemplateDataRows构建一个表 其中每行可以有不同数量的子行 示例界面如下所示 interface ReportCard student string