【问题标题】:How do i search all columns of kendo grid at the same time?如何同时搜索剑道网格的所有列?
【发布时间】:2014-03-10 16:08:45
【问题描述】:

我已经尝试过这个人的做法,并且效果很好,感谢您的这篇文章:

Search All Columns in KendoUI Grid

但是,我现在遇到的问题是,当您尝试一次搜索多个列时,一旦您使用一个新词,它就不再有效。

我如何告诉它忽略空格并继续搜索包含?

因此,如果您在我单独搜索时搜索“Verizon LTE”、“Verizon”或“LTE”,它会按应有的方式进行搜索,但是当它们在一起时,它会返回零个结果,而不是同时包含这两个项目。

这是我目前的搜索,和上面的链接风格一样

$(document).ready(function () {



//change event
$("#search").keyup(function () {
    var val = $('#search').val();
    $("#grid").data("kendoGrid").dataSource.filter({
        logic: "or",
        filters: [
            {
                field: "ServiceProviderName",
                operator: "contains",
                value: val
            },
            {
                field: "ManufacturerName",
                operator: "contains",
                value: val
            },
            {
                field: "ModelNumber",
                operator: "contains",
                value: val
            },
            {
                field: "ModelName",
                operator: "contains",
                value: val
            },
            {
                field: "Technology",
                operator: "contains",
                value: val
            },
            {
                field: "OSTypeName",
                operator: "contains",
                value: val
            }
        ]
    });


});
});

这是剑道网格过滤的限制吗?

【问题讨论】:

    标签: search kendo-ui filtering kendo-grid kendo-asp.net-mvc


    【解决方案1】:

    当您过滤时,默认情况下 KendoUI 会尝试匹配您键入的整个短语。因此,如果您输入“Verizon”,它将匹配包含“Verizon”的任何内容。如果您输入“LTE”,它将匹配包含“LTE”的任何内容。但是,当您输入“Verizon LTE”时,它将匹配包含“Verizon LTE”的任何内容,而您似乎希望它匹配“Verizon”、“LTE”和“Verizon LTE”(匹配时无论如何都会发生这种情况前两个。

    为了进行这种类型的过滤,您需要在过滤函数中预处理val,以便创建一个搜索词数组,使用空格作为标记拆分器,然后执行您的过滤数组的每个成员并返回聚合结果。

    所以,为了将您的搜索词按空格分开:

    var val = $("#search").val().split(" ");

    这将使 val 成为数组而不是文字值,因此您需要根据该数组中的每个值生成过滤器数组。有很多方法可以做到,但这里有一种方法:

    filters: getFieldFilter("ServiceProviderName", "contains", val)
    .concat(getFieldFilter("ManufacturerName", "contains", val))
    .concat(...);
    

    ...getFieldFilter 可能如下所示:

    function getFieldFilter(field, operator, values) {
       var ret = [];
       for(var i = 0; i < values.length; i++) {
          ret.push(
              {
                 field: field,
                 operator: operator,
                 value: values[i]
              });
        }
        return ret;
    }
    

    【讨论】:

    • 是的,我只是在尝试 .Split(" ") 并进行了一些古怪的搜索,但仍然返回了所有结果。我要试试这个看看。这是题外话,但我以前从未见过 .push,你能快速解释一下它的作用/是什么吗?
    • Array.prototype.push() 将一个元素附加到数组的末尾并返回新数组的长度。 Mozilla 文档:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
    • 这并不完全像我想要的那样工作,我忘了提到我还希望它继续搜索搜索结果......所以如果 Verizon 带回 112 行,如果我添加另一个字段,我想过滤已经过滤的字段。如果不进行服务器搜索,这可能吗?否则我只会有一个搜索字段来发布服务器搜索并每次返回所有原始数据
    • 但是,这与我最初发布的完全一样,谢谢您的回答!
    • $("#search").val().trim().split(/[\s]+/) 可能是拆分搜索词的更好方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    相关资源
    最近更新 更多