根据documentation: Quick Filter,快速过滤器适用于clientSide
行模型。
我们为ag-grid使用了serverSide
行模型,并且要求对网格中的缓存块中的客户端数据使用快速过滤器。
尽管我将过滤器管道与[rowData]="myRowData"
一起使用,但是对于此行模型,我没有从myRowData
获得任何数据。
例如,如果您看一下这个Server side row model - quick filter,我已经在标记中分配了
[rowData]="rowData"
并将其初始化为[]
。从服务器加载初始块后,我假设应该可以使用它访问缓存块数据,因此,使用角度管道,我可以在客户端过滤掉数据(模仿
中所做的一样serverSide
行模型的快速过滤器)。类似[rowData]="rowData | filter: filterText"
的事物-就像我们在angularjs
但是恐怕rowData
无法访问缓存数据。
我们如何才能将快速过滤器与具有serverSide
行模型的农业网格一起使用?
答案 0 :(得分:1)
我会说这不是一件容易的事。
但是这是解决方法:
quickFilter
是clientSide
模型类型的功能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();
}
},
};
}