我有一个连接到缓冲商店的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
我需要始终拥有所有记录
答案 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;
}
})
但是你不能在同一个商店使用远程和本地过滤。