我的一个kendo网格标题列中有一个自定义多选下拉元素,标题为"状态"。下拉列表中的每个选项代表许多状态,但为简单起见,它们组合在一起,因此我们可以显示类似状态的组。
由于这是一个自定义过滤器,我知道我必须手动操作剑道过滤器,这似乎让我适合。
如果在我的自定义下拉列表中更改了任何选项,我会触发一个函数来修改过滤器(我已经截断了我在状态数组中旋转的部分,以便于阅读):
// Apply the status filters from the multi-select drop down
function applyStatusFilter(statusValues) {
var gridData = $("#accountsGrid").data("kendoGrid");
var currentFilterObj = gridData.dataSource.filter();
var currentFilters = currentFilterObj ? currentFilterObj.filters : []; // If there are no current filters, set to empty array
var statusFilters = { logic: "or", filters: [] };
var statusArray = statusValues.split(','); // Convert status selections to array
// Remove any pre-existing status filters from the existing filter
if (currentFilters && currentFilters.length > 0) {
for (var i = 0; i < currentFilters.length; i++) {
if (currentFilters[i].field == 'status') {
currentFilters.splice(i, 1);
//break;
}
}
}
if (statusArray[0].length > 0) {
$.each(statusArray, function (key, value) {
if (value == 'AC') {
statusFilters.filters.push({
field: "status",
operator: "eq",
value: "A"
});
statusFilters.filters.push({
field: "status",
operator: "eq",
value: "G"
});
statusFilters.filters.push({
field: "status",
operator: "eq",
value: "O"
});
if (value == 'OH') {
statusFilters.filters.push({
field: "status",
operator: "eq",
value: "G"
});
statusFilters.filters.push({
field: "status",
operator: "eq",
value: "H"
});
statusFilters.filters.push({
field: "status",
operator: "eq",
value: "I"
});
}
});
}
currentFilters.push(statusFilters);
gridData.dataSource.filter({
logic: "and",
filters: currentFilters
});
}
虽然它仍在进行中,但它并未按预期工作。有两个主要问题;当我调用此函数时,我想删除所有当前状态&#34;相关过滤器,然后重建。我无法清除所有过滤器,因为我需要维护可能应用的其他列过滤器。我的移除状态过滤器块似乎无法正常工作。
第二大问题,是如何正确组合两个过滤器对象;当一个人可以使用&#34;或&#34;嵌套阻止状态过滤器逻辑,然后使用&#34;和&#34;将其组合到任何可能的现有过滤器两个过滤器对象之间的逻辑。
答案 0 :(得分:0)
关于你的第一期。确定有几种方法可以删除所有当前状态&#34;相关的过滤器,但我已经建立了一个递归函数,清除给定列的过滤器。
function clearFilter(filter, columnToClear) {
if (filter == undefined)
return filter;
if (filter.logic != undefined) {
filter.filters = $.map(filter.filters, function (val) {
if (val.field == undefined && typeof (val.filters) == "object" && typeof (val.logic) == "string") {
val.filters = clearFilter(val.filters, columnToClear)
if (val.filters.length == 0)
val = null;
return val;
}
else if (val.field != columnToClear)
return val;
});
if (filter.filters.length == 0)
filter = null;
}
else {
filter = $.map(filter, function (val) {
if (val.field != columnToClear)
return val;
});
}
return filter;
}
在你的情况下,该函数应该被称为:
clearFilter(currentFilterObj, "status");