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

非懒加载模式的PrimeNG p-table能否在表头下方显示加载spinner

实现方案

完全可以实现,未开启懒加载的普通PrimeNG p-table同样支持表头正常显示、仅内容区域展示加载状态的效果。


方案1:使用p-table内置loading属性(推荐)

这是最简单的实现方式,利用PrimeNG p-table原生支持的loading相关配置,无需改动原有业务逻辑:

步骤1:调整外层判断逻辑

删除原有外层div的*ngIf="(notificationDashboardLi && notificationDashboardLi.length > 0)"判断,避免加载阶段无数据时整个表格被隐藏,导致表头无法显示。

步骤2:给p-table添加loading配置

在p-table标签上添加[loading]属性绑定你的加载状态变量,同时自定义加载模板替换默认的加载样式:

<div class="row" style="padding:10px;">
    <div class="col-sm-12">
    <p-table #dt [value]="notificationDashboardLi" [columns]="cols" [paginator]="true" [rows]="rowsPerPage" 
    [rowsPerPageOptions]="rowsPerPageOptions" [responsive]="true" dataKey="id"
    [loading]="isLoading">
        <ng-template pTemplate="header" let-columns>
            <tr>
                <!-- 原有表头代码保持不变 -->
            </tr>
        </ng-template>
        <!-- 自定义加载模板,仅在内容区域显示 -->
        <ng-template pTemplate="loading">
            <div style="padding: 2rem 0; text-align: center;">
                <div class="loader"></div>
            </div>
        </ng-template>
        <ng-template pTemplate="rowexpansion" let-rowData let-columns="columns">
            <tr>
                <!-- 原有行展开代码保持不变 -->
            </tr>
        </ng-template> 
         <ng-template pTemplate="body" let-rowData let-columns="columns" let-expanded="expanded">
            <tr>
                <!-- 原有行内容代码保持不变 -->
            </tr> 
        </ng-template>
        <!-- 可选:空数据状态模板,加载完成后无数据时显示 -->
        <ng-template pTemplate="emptymessage" let-columns>
            <tr>
                <td [attr.colspan]="columns.length" style="text-align: center; padding: 2rem 0;">
                    暂无数据
                </td>
            </tr>
        </ng-template>
    </p-table>
</div>

步骤3:控制加载状态

在你的业务逻辑中,数据请求发起前将isLoading设为true,数据赋值给notificationDashboardLi完成后将isLoading设为false即可。

方案2:利用空状态模板实现

如果你的PrimeNG版本较低不支持自定义loading模板,可以用空状态模板变通实现:
加载阶段将p-table的value绑定为空数组,此时会自动显示emptymessage模板,加载完成后再赋值真实数据:

<p-table #dt [value]="isLoading ? [] : notificationDashboardLi" [columns]="cols" [paginator]="true" [rows]="rowsPerPage" 
[rowsPerPageOptions]="rowsPerPageOptions" [responsive]="true" dataKey="id">
    <!-- 原有表头代码不变 -->
    <ng-template pTemplate="emptymessage" let-columns>
        <tr>
            <td [attr.colspan]="columns.length" style="text-align: center; padding: 2rem 0;">
                <div *ngIf="isLoading">
                    <div class="loader"></div>
                </div>
                <div *ngIf="!isLoading">
                    暂无数据
                </div>
            </td>
        </tr>
    </ng-template>
    <!-- 其他模板代码不变 -->
</p-table>

注意事项

两种方案均不依赖懒加载配置,普通模式的p-table完全可用。如果出现加载阶段表头不显示的问题,优先检查是否有外层*ngIf判断限制了表格的渲染。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:06:05