如何在服务器端/无限行模型中使用快速过滤器?

时间:2018-11-29 13:24:41

标签: ag-grid ag-grid-angular

根据documentation: Quick Filter,快速过滤器适用于clientSide行模型。

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

尽管我将过滤器管道与[rowData]="myRowData"一起使用,但是对于此行模型,我没有从myRowData获得任何数据。

  

例如,如果您看一下这个Server side row model - quick filter,我已经在标记中分配了[rowData]="rowData"并将其初始化为[]

     

从服务器加载初始块后,我假设应该可以使用它访问缓存块数据,因此,使用角度管道,我可以在客户端过滤掉数据(模仿serverSide行模型的快速过滤器)。类似[rowData]="rowData | filter: filterText"的事物-就像我们在

中所做的一样

但是恐怕rowData无法访问缓存数据。

我们如何才能将快速过滤器与具有serverSide行模型的农业网格一起使用?

2 个答案:

答案 0 :(得分:1)

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

但是这是解决方法:

  1. 您已经提到quickFilterclientSide模型类型的功能
  2. 但是没有人取消setFilterModel的使用方式
      

    这将需要大量的破解,并且可能会破坏某些内容(您必须在解决方案上进行检查并写出反馈)

首先,setFilterModel无法使用虚拟数据(我们必须为column逻辑定义quickFilter

{
    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"
    }
},

接下来,我们需要为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) ...
}

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

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

并带有有限的道具道具:但是我们将使用filter(在实际情况下会使用

applyFilter(){
    this.gridApi.setFilterModel({"-":{filter: this.filterText}})
}

实现的最后一点是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;
}

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

  

此外,一旦您滚动到现有范围之外(无限制滚动),请求的数据将被此属性过滤

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

我的 sample

您修改后的 sample

答案 1 :(得分:0)

最终我找到了ag-Grid的支持文章:

https://ag-grid.zendesk.com/hc/en-us/articles/360020488612?input_string=serverside+quick+filter

第一个示例建议编辑getRows中的ServerSideDatasource,以将新密钥附加到params.request上。

例如,您可以执行以下操作:

const customParams = {};
customParams.quickFilterValue = 'someQuery';

onGridReady中:

const datasource = createServerSideDatasource(server, customParams);
event.api.setServerSideDatasource(datasource)
/**
 *
 * @param {object} server
 * @param {object} customParams
 * @returns {object}
 */
export function createServerSideDatasource(server, customParams) {
  // https://www.ag-grid.com/javascript-grid-server-side-model-datasource/

  return {
    getRows: function (params) {
      params.request.customParams = customParams // Our backend will need to handle this custom 'customParams' key that the frontend attaches to the request (which itself will contain a quickFilterValue key and maybe others).

      const response = server.getData(params.request);

      if (response.success) {
        params.successCallback(response.rows, response.lastRow);
      } else {
        params.failCallback();
      }

    },
  };
}