【问题标题】:Complex filtering on Kendo DatasourcesKendo 数据源上的复杂过滤
【发布时间】:2015-01-28 17:22:49
【问题描述】:

我有一些 Kendo Grid 和 Scheduler,我想应用一个复杂的过滤器,例如((A 或 B 或 C)和(D 或 E))。如果过滤器很简单,比如(A 或 B 或 C),一切正常,但使用第一个提到的复杂类型的过滤器,我无法实现。

这是我尝试过的:

function filterByTechnicalAndStatus() {
    var allFilters = [];
    var technicalFilters = { logic: "or", filters: [] };
    var statusFilters = { logic: "or", filters: [] };
    var scheduler = $("#scheduler").data("kendoScheduler");
    var userGrid = $("#userGrid").data("kendoGrid");
    var selectedUsers = userGrid.select();
    if (selectedUsers.length != 0) {
        for (var i = 0; i < selectedUsers.length; i++) {
            var code = userGrid.dataItem(selectedUsers[i]).Code;
            technicalFilters.filters.push({ field: "Technical", operator: "eq", value: code });
        }
    }
    if ($('#chk_PL').prop('checked')) {
        statusFilters.filters.push({ field: "InspectionStatusCode", operator: "eq", value: "PL" });
    }
    if ($('#chk_OPEN').prop('checked')) {
        statusFilters.filters.push({ field: "InspectionStatusCode", operator: "eq", value: "OPEN" });
    }
    if ($('#chk_EXEC').prop('checked');) {
        statusFilters.filters.push({ field: "InspectionStatusCode", operator: "eq", value: "EXEC" });
    }

    allFilters.push(statusFilters);
    allFilters.push(technicalFilters);

    scheduler.dataSource.filter(
        [
            { "logic": "or",
                "filters": [
                            { "field": "InspectionStatusCode", "operator": "eq", "value": "PL" },
                            { "field": "InspectionStatusCode", "operator": "eq", "value": "OPEN" }
                            ]
            },
            { "logic": "or",
                "filters": [
                            { "field": "Technical", "operator": "eq", "value": "PSOARES" },
                            { "field": "Technical", "operator": "eq", "value": "ASOARES" }
                            ]
            }
        ]
    );
    //scheduler.dataSource.filter(allFilters);
    }

在上述函数的末尾,我将scheduler.dataSource.filter 设置为“手动”,并且位于注释行的下方。手动设置按预期工作:但是,显然我不想“手动”执行此操作。

注释行是我预期的,但会中断并打开 kendo.all.min.js 文件并显示语法错误警报。

我找到了thisthis,但无法解决我的问题。除了“手动”,如何设置复杂的过滤器?

【问题讨论】:

    标签: javascript kendo-ui telerik kendo-grid


    【解决方案1】:

    尝试做:

    ds.filter([
        {
            "logic":"and",
            "filters":[
                {
                    "logic":"or",
                    "filters":[
                        // Your A condition
                        { "field": "InspectionStatusCode", "operator": "eq", "value": "PL" },
                        // Your B condition
                        { "field": "InspectionStatusCode", "operator": "eq", "value": "OPEN" }
                        {
                            // Your C condition
                        }
                    ]
                },
                {
                    "logic":"or",
                    "filters":[
                        {
                            // Your D condition
                        },
                        {
                            // Your E condition
                        }
                   ]
                }
            ]
        }
    ]);
    

    即使用登录“AND”编写第一个过滤器,其中包含两个过滤器。这些过滤器中的每一个都有您想要的条件和“OR”过滤器。

    记住:

    【讨论】:

    • 感谢您的回答。您能否在Your A condition 之类的注释行中写一个我可以拥有的示例?设置过滤器的条件可以在问题内的代码中看到,这就是我构建两个子过滤器的方式
    • 我尝试将 if 条件放在您有 // Your A condition 的位置,但 IDE 在代码中显示错误:"filters": [ if (chk_pl) { { "field": "InspectionStatusCode", "operator": "eq", "value": "PL" } },
    • 但是你不能包含代码。只有和 - 或不同的过滤条件
    • 但是我想根据之前的检查来定义过滤器,而不是写{ "field": "InspectionStatusCode", "operator": "eq", "value": "PL" }所需的次数,我想用这些行传递一个数组。如果您分析我的代码,您会看到我创建了两个子过滤器(数组),其中填充了我需要的内容。我只想将它们传递给dataSource.filter
    • 如果你想添加新的限制意味着你正在使用它们。您在过滤器数组中定义一个和一个元素,并在需要时将过滤器向量推入新的限制
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多