如何同时搜索剑道网格的所有列?

时间:2014-03-10 16:08:46

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

我已经尝试过这个人做了什么,并且它完美无缺,谢谢你的帖子:

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


});
});

这是Kendo网格过滤的限制吗?

1 个答案:

答案 0 :(得分:2)

过滤时,默认情况下,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;
}