如何将快速过滤器与服务器端/无限行模型一起使用?

Par*_*osh 5 ag-grid ag-grid-angular

根据文档:快速过滤器,快速过滤器适用于clientSide行模型。

我们正在为serverSide使用行模型,并且我们需要对客户端(网格的缓存块中)的数据使用快速过滤器。

我虽然使用过滤器管道[rowData]="myRowData",但对于这个行模型,我没有从 中获取任何数据myRowData

例如,如果您查看这个 plunk服务器端行模型 - 快速过滤器,我已[rowData]="rowData"在标记中进行分配并将其初始化为[]

从服务器加载初始块后,我假设应该可以使用它访问缓存块数据,以便使用角度管道,我将能够在客户端过滤掉数据(模仿行模型的快速过滤器serverSide)。就像我们以前在[rowData]="rowData | filter: filterText"中所做的那样

但我担心缓存数据无法通过rowData.

我们如何以某种方式将快速过滤器与具有serverSide行模型的 ag-grid 一起使用?

un.*_*ike 5

我想说这不是一件容易的事。

但解决方法如下:

  1. 正如您已经提到的,quickFilter这是一个clientSide模型类型功能
  2. 但没有人取消这种setFilterModel使用方式

    这需要大量的修改,并且可能会破坏某些东西(你必须在你的解决方案中检查它并然后写反馈)

首先,setFilterModel不能使用虚拟数据(我们必须专门columnquickFilter逻辑定义)

{
    field:'-', would be used as a reference
    hide:true, - hide in grid data
    lockVisible:true, - disable visibility changing via menu
    filter:"agTextColumnFilter", - require for setFilterModel
    filterParams:{
      newRowsAction: "keep"
    }
},
Run Code Online (Sandbox Code Playgroud)

接下来,我们需要创建一个解决filterModel方法datasource

getRows: function(params) {
    setTimeout(function() {
        var dataAfterSortingAndFiltering = sortAndFilter(data, params.sortModel, params.filterModel);
        var rowsThisPage = dataAfterSortingAndFiltering.slice(params.startRow, params.endRow);
        var lastRow = -1;
        if (dataAfterSortingAndFiltering.length <= params.endRow) {
            lastRow = dataAfterSortingAndFiltering.length;
        }
        params.successCallback(rowsThisPage, lastRow);
    }, 3000);
}

function sortAndFilter(allOfTheData, sortModel, filterModel) {
  return sortData(sortModel, filterData(filterModel, allOfTheData));
}
function sortData(sortModel, data) {
  ... sort logic here (doesn't matter for now) ...
}
Run Code Online (Sandbox Code Playgroud)

现在关于quickFilter逻辑,我们已经dummy为其定义了列,以及如何使用它:

setFilterModel 将仅接受现有的列名称(在我们的例子中为“-”

并使用有限的对象道具:但我们将使用filter(如在实际情况中使用的那样)

applyFilter(){
    this.gridApi.setFilterModel({"-":{filter: this.filterText}})
}
Run Code Online (Sandbox Code Playgroud)

最后一个实现点是filterData函数

function filterData(filterModel, data) {
  let filterPresent = filterModel && Object.keys(filterModel).length > 0;
  if (!filterPresent) { - if filter model is empty - skip it
    return data;
  }
  data = data.filter(i=>{
    if(Object.keys(i).some(k => i[k] && i[k].toString().toLowerCase().includes(filterModel['-'].filter)))
      return i;
  })
  return data;
}
Run Code Online (Sandbox Code Playgroud)

将探索每个对象,如果任何属性包含quickFilter值 - 它将出现在结果中

此外,一旦滚动超出现有范围(无限滚动情况),请求的数据将被此属性过滤

*不确定是否应要求检查重复数据

我的sample

你修改过的sample