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

Angular组件继承AgGridDatasource抽象类报错:未实现继承的抽象成员

Angular抽象类扩展AgGrid可复用组件报错解决方案

错误根因

  • Angular组件构造函数访问修饰符错误:AgGridComponent的构造函数声明为protected,Angular依赖注入系统实例化组件时要求构造函数必须为public,无法实例化受保护构造函数的类。
  • 构造函数参数注入问题:原代码构造函数要求传入GridOptions类型的参数,但未配置对应Provider或@Input装饰器,Angular DI无法找到对应实例传入,触发注入错误。
  • 抽象方法实现类型不兼容:createColumns方法未显式声明返回值类型为AbstractColDef[],严格TypeScript配置下会判定未正确实现抽象类的抽象方法,同时@Input传入的columns未设置默认值,存在返回undefined的可能,不符合抽象方法返回值要求。
  • this指向错误:dataSource中的getRows方法使用普通函数声明,运行时this指向IDatasource对象本身,不是AgGridComponent实例,无法获取到@Input传入的datasource数组。
  • 行模型模块不匹配:配置了rowModelType为infinite,但引入的模块是ServerSideRowModelModule,模块不匹配导致行模型无法正常加载。
  • 方法调用时机错误:ngOnInit阶段Grid尚未初始化,_gridApi为undefined,此时调用refreshColumns不会生效,需要等待onGridReady触发后再操作Grid实例。

修正后代码

AgGridComponent 修正代码

@Component({
  selector: 'ag-grid',
  templateUrl: './ag-grid.component.html',
  styleUrls: ['./ag-grid.component.css']
})
export class AgGridComponent extends AgGridDatasource implements OnInit {
  @Input() columns: AbstractColDef[] = [];
  @Input() datasource: any[] = [];
  // 若需要外部传入自定义配置可新增该Input
  @Input() customGridOptions: GridOptions = {};
  modules: Module[] = [InfiniteRowModelModule];
  rowCount?: number;

  // 构造函数改为public,无注入参数
  constructor() {
    super(Object.assign({
      rowModelType: 'infinite',
      pagination: false,
      rowSelection: 'none',
      suppressCellSelection: true,
      cacheBlockSize: 100,
    }, this.customGridOptions));
  }

  // 显式声明返回值类型,匹配抽象方法要求
  createColumns(): AbstractColDef[] {
    console.log(`Getting input columns here`)
    console.log(this.columns)
    return this.columns;
  }

  // 重写onGridReady,Grid初始化完成后再操作实例
  override onGridReady(event): void {
    super.onGridReady(event);
    this.refreshColumns();
    this.gridOptions.datasource = this.dataSource;
  }

  ngOnInit() {
    this.createColumns();
  }

  // 用箭头函数绑定this到组件实例
  dataSource: IDatasource = { 
    getRows: (params: IGetRowsParams) => {
      setTimeout(() => {
        console.log(`Getting updated input rows here`)
        console.log(this.datasource)
        params.successCallback(this.datasource, -1);
      }, 200);
    }
  }
}

额外注意事项

  • 父类AgGridDatasource中的_gridApi、_gridColumnApi为private修饰符,若后续子类需要直接访问,建议改为protected修饰符,当前逻辑下不影响运行。
  • 若使用ag-grid企业版,需确认对应模块的导入路径和名称正确。

内容的提问来源于stack exchange,提问作者Ahmer Ali Ahsan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:27:02