ExtJS - 使用RegEx过滤缓冲存储

时间:2016-02-09 08:21:09

标签: javascript mysql regex extjs

我有一个连接到缓冲商店的MYSQL服务器。 在某些情况下我必须过滤记录,研究必须是不敏感,因此我使用正则表达式尝试在每种情况下检查值,因为mysql服务器区分大小写。以下是研究栏的代码:

onSearchClick : function(){
        var me=this;
        if(me.getValue()!==''){
            var value=me.getValue();
            if(value.match(/ /g)){}else{
                value=value.split(""); //rome-> 'r''o''m''e'
                var valueApp='';
                Ext.Array.each(value, function(val) {
                    var m=val.toLowerCase();
                    var M=val.toUpperCase();
                    val='['+m+M+']';//also tryed with ()
                    valueApp=valueApp+val;
                });
                value=new RegExp(valueApp);
                console.log(value); //value=rome returns -> /[rR][oO][mM][eE]/
                me.store.filter{
                    property : me.paramName,
                    value    : value,
                    operator: '*=',
                    caseSensitive: false,
                    exactMatch: false,
                    anyMatch: true
                });
            }
            me.getTrigger('clear').show();
            me.updateLayout();
        }
    }

我无法匹配值,现在数据库中的所有值都是大写的,但可能会改变,所以你有解决这个问题的方法吗? 我的代码有什么问题?

使用ROME作为过滤器值的过滤器,记录会成功过滤,但使用正则表达式无法使记录有效。

EXAMPLEs:



 store.filter(param,value); //tryed with almost all options 
    search rome -> records with rome
    search Rome -> records with Rome

search ROME -> records with ROME
search /[rR][oO][mM][eE]/ -> no records

我需要始终拥有所有记录

1 个答案:

答案 0 :(得分:0)

这里有很多问题和误解。

小注:即使SQL服务器是二进制文件,您也应该能够在表上设置字符集和排序规则。

主要是您正在混合客户端过滤,服务器端过滤和缓冲存储。

客户端过滤只能过滤当时商店中的内容,因此在缓冲商店中,您不会对所有记录执行搜索。您必须查看ExtJS调用的内容和#34;远程过滤"。这意味着ExtJS将过滤器参数发送到服务器,您必须在服务器端实现过滤器。您可以完全自由地定义远程过滤器

property:'propertyThatTheStoreDoesntEvenKnowExists',
operator:'thisIsNotAnOperator',
value:'someValue'

在服务器端,然后你必须实现 a"过滤功能"使用这些变量(我在这里使用一些伪代码):

filter = jsondecode(GET->filter);
if(filter->property=="propertyThatTheStoreDoesntEvenKnowExists" AND filter->operator=="thisIsNotAnOperator")
    result = mysql.buildQuery("SELECT * FROM table WHERE someProperty=@val").bind("@val",filter->value).execute();
else result = mysql.buildQuery("SELECT * FROM table").execute();

然后,商店将始终包含服务器返回的所有记录,不能应用本地过滤。

如果您想使用客户端("本地")过滤,因为您只想搜索当前加载的集合,您可以放心地忽略您对MySQL功能的所有假设。您需要关心的是返回给客户端的字符串,可以在商店中找到。您正在寻找完美的不区分大小写的匹配项,因此您可以将regexp生成完全交给ExtJS。

store.filter({
    property:'mySearchProperty',
    value:'rome',
    caseSensitive:false
})

应匹配Rome,rOme,ROME等,但只搜索商店中的记录。因此,如果页面大小为20,则只搜索20条记录并将其过滤到包含该字符串的记录。在这种情况下,您将被绑定到预定义的运算符;或者你甚至可以定义一个自定义函数,这样就可以过滤掉你想要的任何东西:

var value = textfield.getValue().toLowerCase();
store.filter({
    filterFn:function(record) {
        return record.get("myProperty").toLowerCase().indexOf(value)>-1;
    }
})

但是你不能在同一个商店使用远程和本地过滤。