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

如何用ngTemplateOutlet实现支持自定义模板的PrimeNG可复用表格

PrimeNG可复用表格组件支持自定义Body模板实现方案

1. 改造可复用表格组件(ReusableTableComponent)

在组件类中添加@ContentChild装饰器,捕获外部传入的自定义body模板,同时保留原有输入参数:

import { Component, Input, ContentChild, TemplateRef } from '@angular/core';

@Component({
  selector: 'app-reusable-table',
  templateUrl: './reusable-table.component.html',
  styleUrls: ['./reusable-table.component.css']
})
export class ReusableTableComponent {
  @Input() data: any[] = [];
  @Input() cols: any[] = [];
  // 捕获外部传入的自定义body模板,约定引用标识为tableBody
  @ContentChild('tableBody') customBodyTemplate?: TemplateRef<any>;
}

2. 修改可复用组件模板逻辑

在表格模板中通过条件判断,优先使用外部传入的自定义模板,否则渲染默认body内容:

<p-table [value]="data" [columns]="cols">
  <ng-template pTemplate="header" let-columns>
    <tr>
      <th *ngFor="let col of columns">{{ col.header }}</th>
    </tr>
  </ng-template>

  <!-- 自定义模板渲染逻辑 -->
  <ng-template *ngIf="customBodyTemplate; else defaultBody" 
               pTemplate="body" 
               let-rowData 
               let-columns="columns">
    <ng-container [ngTemplateOutlet]="customBodyTemplate" 
                  [ngTemplateOutletContext]="{ rowData: rowData, columns: columns }">
    </ng-container>
  </ng-template>

  <!-- 默认body模板实现 -->
  <ng-template #defaultBody pTemplate="body" let-rowData let-columns="columns">
    <tr>
      <td *ngFor="let col of columns">
        {{ rowData[col.field] }}
      </td>
    </tr>
  </ng-template>
</p-table>

3. CustomUsers组件传入自定义模板

在使用可复用表格时,通过#tableBody标识传入定制化的body模板,比如给用户名称添加超链接:

<app-reusable-table [data]="users" [cols]="cols">
  <ng-template #tableBody let-rowData let-columns="columns">
    <tr>
      <td *ngFor="let col of columns">
        <ng-container *ngIf="col.field === 'name'">
          <a [routerLink]="['/users', rowData.id]">{{ rowData[col.field] }}</a>
        </ng-container>
        <ng-container *ngIf="col.field !== 'name'">
          {{ rowData[col.field] }}
        </ng-container>
      </td>
    </tr>
  </ng-template>
</app-reusable-table>

4. Users组件保持原有用法(无影响)

原Users组件无需修改,直接使用可复用表格即可自动加载默认body模板:

<app-reusable-table [data]="users" [cols]="cols"></app-reusable-table>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 01:55:18