将Kendo网格过滤器对象与“和”&组合“或”逻辑运算符

时间:2014-08-25 23:47:54

标签: object kendo-ui telerik kendo-grid

我的一个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;将其组合到任何可能的现有过滤器两个过滤器对象之间的逻辑。

1 个答案:

答案 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");