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

PrimeNG表格每行添加复选框失败,报NullInjectorError错误求助

问题分析与解决方案

错误原因

你遇到的NullInjectorError: R3InjectorError(AppModule)[Table -> Table]错误,核心原因有两个:

  1. PrimeNG的Table服务未被正确注入,通常是模块未导入TableModule
  2. p-tableCheckbox是PrimeNG表格的内置组件,必须依赖父级p-table的上下文才能工作,你的自定义模板传递方式可能破坏了这个上下文关联

具体修复步骤

1. 模块导入必要的PrimeNG模块

在你的AppModule或子组件所属模块中,导入TableModule和CheckboxModule:

import { TableModule } from 'primeng/table';
import { CheckboxModule } from 'primeng/checkbox';

@NgModule({
  imports: [
    // 其他已有模块
    TableModule,
    CheckboxModule
  ]
})
export class AppModule { }

2. 修正自定义模板结构

删除多余的原生<input>复选框,保证p-tableCheckbox在正确的上下文里:

<app-prime-table
  [data]="data"
  [columns]="columns"
  [globalFilters]="columns"
  [displayFilter]="true"
  [customBodyTemplate]="customBodyTemplate"
>
</app-prime-table>

<ng-template #customBodyTemplate let-rowData let-columns="columns">
  <tr>
    <td *ngFor="let col of columns">
      <div *ngIf="col.type === 'checkbox'">
        <p-tableCheckbox [value]="rowData"></p-tableCheckbox>
      </div>
      <ng-container *ngIf="col.type !== 'checkbox'">
        <div *ngIf="!col.type">{{ rowData[col.field] }}</div>
        <div *ngIf="col.type === 'date'">
          {{ formatDate(rowData[col.field]) }}
        </div>
      </ng-container>
    </td>
  </tr>
</ng-template>

3. 检查子组件app-prime-table的实现

确保子组件内部的p-table正确传递模板上下文,让p-tableCheckbox能获取到父级Table实例:

<!-- app-prime-table.component.html -->
<p-table 
  [value]="data"
  [columns]="columns"
  [globalFilterFields]="globalFilters.map(col => col.field)"
  [showFilter]="displayFilter"
>
  <ng-template pTemplate="body" let-rowData>
    <ng-container 
      *ngTemplateOutlet="customBodyTemplate; context: { $implicit: rowData, columns: columns }"
    ></ng-container>
  </ng-template>
</p-table>

子组件的TypeScript代码要正确接收模板输入:

// app-prime-table.component.ts
import { Component, Input, TemplateRef } from '@angular/core';

@Component({
  selector: 'app-prime-table',
  templateUrl: './app-prime-table.component.html'
})
export class AppPrimeTableComponent {
  @Input() data: any[];
  @Input() columns: any[];
  @Input() globalFilters: any[];
  @Input() displayFilter: boolean;
  @Input() customBodyTemplate: TemplateRef<any>;
}

4. 确认列配置正确性

你的columns数组需要包含type: 'checkbox'的列定义:

columns = [
  { type: 'checkbox', header: '选择' },
  { field: 'name', header: '名称' },
  { field: 'date', header: '日期', type: 'date' }
];

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 17:01:00