【问题标题】:Combining Kendo grid filter objects with "and" & "or" logic operators将 Kendo 网格过滤器对象与“and”和“or”逻辑运算符组合
【发布时间】:2014-08-25 23:47:54
【问题描述】:

我的剑道网格标题栏中有一个自定义的多选下拉元素,标题为“状态”。下拉列表中的每个选项代表许多状态,但为了简单起见,它们被组合在一起,因此我们可以显示类似状态的组。

由于这是一个自定义过滤器,我知道我必须手动操作剑道过滤器,这似乎让我很适应。

当我的自定义下拉列表中的任何选择发生更改时,我会启动一个函数来修改过滤器(我在状态数组中旋转的部分已被截断,以便于阅读):

// 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
    });
}

这并没有按预期工作,尽管它仍在进行中。有两个主要问题;当我调用这个函数时,我想删除所有当前的“状态”相关过滤器,然后重建。我无法清除所有过滤器,因为我需要维护可能应用的其他列过滤器。我的删除状态过滤器块似乎不起作用。

第二个大问题,是如何正确组合两个过滤器对象;当一个可以使用“或”逻辑嵌套的状态过滤器块时,然后使用两个过滤器对象之间的“和”逻辑将其组合到任何可能的现有过滤器。

【问题讨论】:

  • 这里有一个逻辑,不要关心你当前拥有的网格过滤器。只需在多选的更改事件中获取所有值并制作一个过滤器对象并等于网格数据源过滤器并刷新网格。这行得通吗?

标签: object kendo-ui telerik kendo-grid


【解决方案1】:

关于您的第一个问题。确实有几种方法可以删除所有当前的“状态”相关过滤器,但我已经构建了一个递归函数来清除给定列的过滤器。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 2017-02-11
    相关资源
    最近更新 更多