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

如何将多个ng-template传入自定义组件并透传给Teradata Covalent DataTable

如何将ng-template透传至自定义组件并传递给Teradata Covalent的td-data-table

问题背景

我之前也遇到过完全一样的需求:自定义了<app-datatable>组件,需要把内部定义的多个带有tdDataTableTemplate指令的ng-template透传到底层的Teradata Covalent td-data-table组件,因为这个组件支持通过模板自定义列的渲染逻辑,但翻遍Covalent官方文档也没找到现成的透传方案。

你给出的使用示例很典型:

<app-datatable>
  <ng-template tdDataTableTemplate="description" let-value="value" let-row="row" let-column="column">
    <p matTooltip="{{ row[column ]}}">{{ row[column] }}</p>
  </ng-template>
  <ng-template tdDataTableTemplate="vendorName" let-value="value">
    <p matTooltip="{{ value }}">{{ value }}</p>
  </ng-template>
</app-datatable>

我的解决方案

既然官方没有提供直接的透传方式,我选择了重写Teradata的表格组件为自定义表格,这样能完全掌控模板的传递和渲染逻辑,彻底解决透传的局限性。

核心实现思路

  • 在自定义的<app-datatable>组件中,通过ContentChildren获取所有带有TdDataTableTemplateDirective的模板实例
  • 基于自己的表格结构(替代原td-data-table),遍历列配置和数据行,匹配对应的模板并传入正确的上下文(比如value、row、column)
  • 这样就能让外层传入的模板直接在自定义表格中生效,完全不需要依赖原组件的透传机制

代码示例

自定义表格组件类

import { Component, ContentChildren, Input, QueryList } from '@angular/core';
import { TdDataTableTemplateDirective } from '@covalent/core/data-table';

@Component({
  selector: 'app-datatable',
  templateUrl: './datatable.component.html',
  styleUrls: ['./datatable.component.scss']
})
export class DatatableComponent {
  @Input() columns: Array<{ name: string; label: string }> = [];
  @Input() data: any[] = [];

  // 获取所有传入的tdDataTableTemplate模板
  @ContentChildren(TdDataTableTemplateDirective) private _templates!: QueryList<TdDataTableTemplateDirective>;

  // 根据列名匹配对应的模板
  getTemplate(columnName: string) {
    return this._templates.find(tpl => tpl.name === columnName)?.templateRef || null;
  }
}

自定义表格模板

<!-- 自定义表格结构,可根据需求调整样式 -->
<table class="custom-data-table">
  <thead>
    <tr>
      <th *ngFor="let column of columns">{{ column.label }}</th>
    </tr>
  </thead>
  <tbody>
    <tr *ngFor="let row of data">
      <td *ngFor="let column of columns">
        <!-- 使用ngTemplateOutlet渲染匹配到的模板,并传入上下文 -->
        <ng-container 
          *ngIf="getTemplate(column.name); let template"
          [ngTemplateOutlet]="template"
          [ngTemplateOutletContext]="{ 
            value: row[column.name], 
            row: row, 
            column: column 
          }"
        ></ng-container>
        <!-- 如果没有匹配到模板,默认渲染值 -->
        <span *ngIf="!getTemplate(column.name)">{{ row[column.name] }}</span>
      </td>
    </tr>
  </tbody>
</table>

这样一来,你就能像之前示例那样在<app-datatable>中传入自定义模板,自定义表格会自动匹配并渲染对应的内容,完全实现了原td-data-table的模板自定义能力,同时还能根据业务需求扩展更多功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:01:10