【发布时间】:2012-02-15 14:46:15
【问题描述】:
我使用工具栏搜索。您可以为一列搜索多个单词吗?分隔符是一个空格,应该使用 Like 运算符进行搜索。因此,搜索应该返回满足搜索字符串中所有单词的所有行,无论它们在行字段中的顺序如何。例如有一列“产品名称”,我想查找所有产品名称包含单词“lever”并且包含单词“left”的行。
【问题讨论】:
我使用工具栏搜索。您可以为一列搜索多个单词吗?分隔符是一个空格,应该使用 Like 运算符进行搜索。因此,搜索应该返回满足搜索字符串中所有单词的所有行,无论它们在行字段中的顺序如何。例如有一列“产品名称”,我想查找所有产品名称包含单词“lever”并且包含单词“left”的行。
【问题讨论】:
一个有趣的问题!
我创建了the demo,它演示了如何实现多词搜索:
对应的代码是:
$grid.jqGrid('filterToolbar', {
stringResult: true,
defaultSearch: "cn",
beforeSearch: function () {
modifySearchingFilter.call(this, ' ');
}
});
modifySearchingFilter我在哪里定义的方式:
var modifySearchingFilter = function (separator) {
var i, l, rules, rule, parts, j, group, str,
filters = $.parseJSON(this.p.postData.filters);
if (filters && typeof filters.rules !== 'undefined' && filters.rules.length > 0) {
rules = filters.rules;
for (i = 0; i < rules.length; i++) {
rule = rules[i];
if (rule.op === 'cn') {
// make modifications only for the 'contains' operation
parts = rule.data.split(separator);
if (parts.length > 1) {
if (typeof filters.groups === 'undefined') {
filters.groups = [];
}
group = {
groupOp: 'OR',
groups: [],
rules: []
};
filters.groups.push(group);
for (j = 0, l = parts.length; j < l; j++) {
str = parts[j];
if (str) {
// skip empty '', which exist in case of two separaters of once
group.rules.push({
data: parts[j],
op: rule.op,
field: rule.field
});
}
}
rules.splice(i, 1);
i--; // to skip i++
}
}
}
this.p.postData.filters = JSON.stringify(filters);
}
};
更新:Free jqGrid 支持Custom filtering searching Operation,这使得上述场景的实现变得非常容易。
【讨论】:
groups 部分中的groupOp='OR' 操作与主要的groupOp='AND' 操作混淆了?
datatype。如果你有'local' 数据类型,你不需要什么都不做。如果您有'json' 或'xml' 数据类型,那么您的问题可能只是因为您没有实现完全支持filters 参数。我的演示包括multipleGroup: true 搜索选项。尝试使用对话框进行搜索并检查filters。