我会说这不是一件容易的事。
但这是如何解决的:
- 正如您已经提到
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
in创建一个解决方法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