ag 网格服务器端分页“当网格位于绘制行的中间时,无法让网格绘制行”

Posted

技术标签:

【中文标题】ag 网格服务器端分页“当网格位于绘制行的中间时,无法让网格绘制行”【英文标题】:aggrid server side paging 'cannot get grid to draw rows when it is in the middle of drawing rows' 【发布时间】:2020-06-28 03:51:03 【问题描述】:

我有一个这样的 agggrid 组件:

  private gridOptions = 
    columnDefs: this.columnDefs,
    frameworkComponents:  buttonRenderer: ButtonRenderer,
    pagination: true, 
    paginationPageSize: 20,
    cacheBlockSize: 20,
    // server side paging
    rowModelType: 'infinite',
    datasource: this.dataSource
   ;

  private dataSource: IDatasource = 
    getRows: (params: IGetRowsParams) => 
      var query =  startrow: params.startRow,
                    endrow: params.endRow,
                    company_name: this.companyName,
                    company_address: this.companyAddress,
                    company_capital: this.companyCapital
                  ;
      this.http.post(environment.api_url + "/register/search",query).subscribe((results:any) => 
        params.successCallback(results.data, results.totalRecords);
        this.gridApi.refresh();
      );            
    
  ;

aggrid 首次加载时,正常显示。如果我按下一页,我会收到此错误:

ERROR Error: "ag-Grid: cannot get grid to draw rows when it is in the middle
of drawing rows. Your code probably called a grid API method while the grid 
was in the render stage. To overcome this, put the API call into a timeout,
eg instead of api.refreshView(), call setTimeout(function()
api.refreshView(),0). To see what part of your code that caused the
refresh check this stacktrace."

有什么例子可以参考吗?我四处搜寻,但没有这个似乎每个人都做得很好 问题。

顺便说一句:我正在使用angular 8,aggrid 22.1.1

【问题讨论】:

我猜你不应该在调用successCallback之后调用网格的refresh()方法,这可能也触发了刷新。如果您确实需要调用 refresh(),请尝试在 setTimeout() 中调用 感谢您的回答。这对我来说是一个 valueFormatter 问题。如果我从列定义中删除 valueFormatter,一切正常。当我检查 chrome 控制台时,我看到格式化程序函数未定义单元格值。我不知道如何修复它,所以我删除了所有 valueFormatter。之后一切正常。 一个提示 - 我发现组件暴露给网格的函数(valueGetters、valueSetters、valueFormatters 等)必须是 Lambda(“胖箭头函数”),而不仅仅是组件的普通方法。 Lambda 绑定了“this”,而普通方法没有。 我在使用 agGrid 24.1 时也遇到了这个问题,而且我的 Angular 代码没有任何 valueFormatter 或对 refresh() 的调用。我有一个带有两级细节网格的主网格,如果我只扩展/收缩几行,在点击之间留下一个健康的停顿,我仍然会收到这个错误......我不知道为什么。 【参考方案1】:

如@Vincemt Chen 评论中所述

感谢您的回答。这对我来说是一个 valueFormatter 问题。如果我从列定义中删除 valueFormatter,一切正常。当我检查 chrome 控制台时,我看到格式化程序函数未定义单元格值。我不知道如何修复它,所以我删除了所有 valueFormatter。之后一切正常。

这也发生在我身上,所以我没有删除有用的valueFormatter,而是添加了检查params.value 是否为undefined。例如:


    headerName: "first cell",
    field: "first field",
    valueFormatter: (params) => 
        if(!params.value) return 'ERROR';

        ...your original code...
    

【讨论】:

以上是关于ag 网格服务器端分页“当网格位于绘制行的中间时,无法让网格绘制行”的主要内容,如果未能解决你的问题,请参考以下文章

ag-grid-community:服务器端分页的无限行模型,社区免费版 agGrid - 不像服务器端分页那样工作

具有无限 rowModelType 问题的 AG Grid 26.0.0 Angular 12.2 服务器端分页

剑道网格服务器端分页

dojo增强了网格服务器端分页无法正常工作

具有服务器端分页/排序的 DevExtreme 数据网格不适用于过滤

Kendo Grid中的服务器端分页?