Ag-Grid |使用 SSRM 设置行计数

问题描述 投票:0回答:1

我在 AgGrid 中使用服务器端行模型 (SSRM)。到目前为止,每次调用 getRows 时,我都让自定义数据源获取总行数和下一页结果。这可行,但效率不高。计算总行数可能是一项成本高昂的操作,一旦扩展到某些表上有数亿行的数据生产级别,它就会导致非常明显的延迟。

因此,我现在尝试仅计算初始加载时和过滤器更改时的行数。为了支持这一点,我删除了数据源获取计数的功能,并通过 onGridReady 和 onFilterChanged 事件异步执行此操作。

检索总计数的请求成功 - 但是当我将计数传递给网格 api 时,它似乎根本没有正确更新网格。我的代码如下所示:

    const apiRef = useRef<GridApi>();
    
    const updateRowCount = useCallback(async () => {
      if(apiRef.current) {
        myApi.getRowCount({
          filterModel: apiRef.current.getFilterModel()
        }).then(count => {
          apiRef.current?.setRowCount(count, true);
        }).catch(reason => {
          console.error(reason);
        });
      }
    }, [myApi]);

    const onFilterChanged = useCallback((e: FilterChangedEvent) => {
      updateRowCount();
    }, [updateRowCount]);
    
    const onGridReady = useCallback((e: GridReadyEvent) => {
      apiRef.current = e.api;
      updateRowCount();
    }, [updateRowCount]);

请注意,我已确认 updateRowCount 函数在适当的时间被调用,它正在成功发送请求并接收响应,并且没有抛出任何错误。所以问题应该仅仅在于如何让setRowCount函数正常工作。也许该功能不适合 SSRM,并且有其他方法可以做到这一点?

我的期望有两个。首先,网格上的垂直滚动条的大小适当,以便我可以根据计数向下滚动最后的记录;即使行尚未加载。其次,触发 ModelChanged 事件并相应更新 DisplayedRowCount。

我目前使用的是AgGrid(企业版)版本^28

谢谢!

ag-grid
1个回答
0
投票

这可能是 ag-grid 中的一个错误。

为什么

setRowCount
方法不能按您的预期工作。我已经对其进行了调试,看起来它在内部调用了
cache
对象上的 setter。如果初始属性为空,该设置器将不起作用。 因此,作为解决方法,您可以首先在
datasource.getRows
方法中设置 rowCount。但您只需要做一次。之后,当您调用
setRowCount(count, true)
时,它将按预期工作。

如何修改数据源以启动

rowCount
的示例:

const datasource = {
  initiated: false,
  getRows: function ({success}) {
    ...
    if(this.initiated) {
      success({ rowData: result });
    } else {
      success({ rowData: result, rowCount: result.length });
    }
    this.initiated = true;
  }
}

我已在 v30 上尝试过此解决方法,并且有效。

注意:我假设,在应用过滤/排序后,内部缓存被破坏,所以可能

rowCount
应该再次重新启动。

© www.soinside.com 2019 - 2024. All rights reserved.