如何在jqgrid中对格式化列值进行本地搜索?

如何在jqgrid中对格式化列值进行本地搜索?,jqgrid,Jqgrid,我使用loadonce预先获取所有数据,然后在本地进行排序和筛选 我的列值之一是对象数组。在colModel选项中,我使用的格式化程序函数如下所示: function my_formatter(cellValue) { return $.map(cellValue, function(element) {return element.human_readable_name;}).join(', '); } setFilterFormatters({'column_with_arr

我使用loadonce预先获取所有数据,然后在本地进行排序和筛选

我的列值之一是对象数组。在colModel选项中,我使用的格式化程序函数如下所示:

function my_formatter(cellValue) 
{ 
    return $.map(cellValue, function(element) {return element.human_readable_name;}).join(', '); 
}
setFilterFormatters({'column_with_array_of_objects':'my_formatter'});
我还使用了一个自定义排序函数,它只返回数组的长度

我的问题是工具栏过滤和多字段对话框过滤不起作用。他们似乎在搜索[objects].toString()而不是格式化的值。因此,当我搜索“[object]”时,我得到了命中率,但当我搜索实际值时却没有

有没有办法让本地筛选使用格式化的值

根据Oleg的回复进行编辑:

我修改了Oleg的代码以添加每列过滤器格式。它似乎工作得很好。我删除了_toStr替换项,因为它似乎没有必要——我认为它是用来修改搜索词的(这在Oleg的重音去除案例中有意义,但在我的案例中没有)

它被称为:

function my_formatter(cellValue) 
{ 
    return $.map(cellValue, function(element) {return element.human_readable_name;}).join(', '); 
}
setFilterFormatters({'column_with_array_of_objects':'my_formatter'});
测试表明,这适用于“contains”、“notcontain”、“equals”、“notequal”(可能是“begins with”和其他简单的字符串比较,但我不使用它们)

谢谢,Oleg。

在trirand论坛的旧版中,我介绍了如何实现自定义本地筛选和排序。显示无重音的搜索和排序。如果您使用相同的技术,您可以覆盖用于搜索的一些jqGrid函数(
\u toStr
\u getStr
),并实现它,以便在使用数组的情况下,您可以使用自己的实现

为了让我的答案更谷歌友好,我加入了一些小代码片段

function myAccentRemovement(s) {
    // the s parameter is always string
    s = s.replace(/[àáâãäå]/gi,'a');
    s = s.replace(/[èéêë]/gi,'e');
    s = s.replace(/[ìíîï]/gi,'i');
    s = s.replace(/[òóôõöø]/gi,'o');
    s = s.replace(/[ùúûü]/gi,'u');
    s = s.replace(/[ýÿ]/gi,'y');
    s = s.replace(/æ/gi,'ae');
    s = s.replace(/œ/gi,'oe');
    s = s.replace(/ç/gi,'c');
    s = s.replace(/š/gi,'s');
    s = s.replace(/ñ/gi,'n');
    s = s.replace(/ž/gi,'z');
    return s;
}
//...
var oldFrom = $.jgrid.from;
$.jgrid.from = function(source,initalQuery){
    var result = oldFrom(source,initalQuery);
    var old_toStr = result._toStr;
    result._toStr=function(s) {
        return myAccentRemovement(old_toStr(s));
    };
    result._getStr=function(s) {
        var phrase=[];
        if(this._trim){
            phrase.push("jQuery.trim(");
        }
        phrase.push("myAccentRemovement(String("+s+"))");
        if(this._trim){
            phrase.push(")");
        }
        if(!this._usecase){
            phrase.push(".toLowerCase()");
        }
        return phrase.join("");
    }
    return result;
}

这将是解决问题的办法。我不能给你更确切的建议,因为你没有发布关于你使用的数据的确切结构的信息。

谢谢,Oleg。您的代码不太适合我,因为它不允许我为不同的列设置不同的值格式。替换_getStr()将替换所有列筛选,而不仅仅是需要格式化的列筛选。如果我的所有列都使用相同的格式,我可以将您的“myAccentRemovement(String)”替换为“my_formatter”。@adampx:这很难帮助您,因为您没有发布您使用的代码。例如,所有其他方法都将列名作为第一个参数。函数
\u getStr
(我在演示中使用了该函数)将在
this.equals
this.contains
中调用。函数
\u getStr
将使用列名调用。因此,您可以实现所有需要的功能,但您应该在我的演示中进行更多更改。仅此任务,感谢发布更新的解决方案。