Extjs combobox下拉框模糊匹配

Tags: , ,

Ext中的combobox有属性typeAhead:true 可以实现模糊匹配,但是是从开始匹配的,如果需要自定的的匹配,则需要监听beforequery方法,实现自己的匹配查询方法:

// 判断某个值str是否存在store里,field是store的字段
var checkIfInStore = function(str, store, field, ignoreCase) {
    var count = store.getCount();
    for( var i = 0; i < count; i++) {
        var val = store.getAt(i).get(field);
        if (ignoreCase) {
            str = str.toUpperCase();
            val = val.toUpperCase();
        }
        if (str == val) {
            return true;
        }
    }
    return false;
};
 
var ComboSearchPlugin = {
    init: function(combo) {
        combo.addListener('blur', function(combo) {
            // 如果没有写完整则设置为空
            var isValid = checkIfInStore(combo.getRawValue(), combo.store, combo.displayField, false);
            if (!isValid) {
                combo.setValue('');
            }
        });
 
        combo.addListener('beforequery', function(qe) {
            var combo = qe.combo;
            var q = qe.query;
            var forceAll = qe.forceAll;
            if (forceAll === true || (q.length >= this.minChars)) {
                if (this.lastQuery !== q) {
                    this.lastQuery = q;
                    if (this.mode == 'local') {
                        this.selectedIndex = -1;
                        if (forceAll) {
                            this.store.clearFilter();
                        } else {
                            // 检索的正则
                            var regExp = new RegExp(".*" + q + ".*", "i");
                            // 执行检索
                            this.store.filterBy(function(record, id) {
                                // 得到每个record的项目名称值
                                var text = record.get(combo.displayField);
                                return regExp.test(text);
                            });
                        }
                        this.onLoad();
                    } else {
                        this.store.baseParams[this.queryParam] = q;
                        this.store.load({
                            params: this.getParams(q)
                        });
                        this.expand();
                    }
                } else {
                    this.selectedIndex = -1;
                    this.onLoad();
                }
            }
            return false;
        });
    }
};

参考文章:http://weibaojun.iteye.com/blog/1098731
原文我试了一下有问题,第一次输入时会不显示结果,主要差别在onLoad上


误删contacts.apk解决方法(不用刷机)

从完整的刷机包内,注意,版本最好是和你手机一致的。如果找不到,可以上网问别人要。

在压缩包目录下android2.3.6.zip\system\app找到Contacts.apk,Contacts.odex文件,如果你把其他文件也删了,也可以按照这个步骤。

连接手机U盘,复制到SD卡。

然后用ROOT Explor从SD卡把这两个文件复制到 手机的这个目录下/system/app/

最后一步!注意,一定要给这两个文件设置权限,在RE里按住文件,选permissions,都勾上read/write权限。

重启一下你的手机,就可以编辑联系人了。


Thrift入门篇-运行Tutorial

Tags:

本文假设你已经了解Thrift是什么了,如果还不了解,请借助强大的谷歌。

本文的开发环境是windows 7 + python2.6

Thrift官方主页:http://thrift.apache.org/

 

先来这里下载thrift-0.7.0.tar.gz 和Thrift compiler for Windows (thrift-0.7.0.exe) 。thrift-0.7.0.exe是帮你编译好的,可以在windows下运行。

解压thrift-0.7.0.tar.gz

 

学一样东西之前,当然是看Tutorial啦,不过文档还不完善啊。下面将以Python来举例子。

1.安装thrift库

先要安装thrift-0.7.0\lib\py里的库,setup.py install 注意,在windows下安装不成功,需要用VC编译,还要对代码做相应修改,很麻烦,就不说了,直接在这里下载已经编译好的版本。http://www.lfd.uci.edu/~gohlke/pythonlibs/ (这里真的是个好地方,感谢大神)

2.Thrift生成代码

Thrift能够帮你生成一部分代码,让你更关注你的业务部分,而不必关注它是怎么通信的。

在thrift-0.7.0\tutorial,就是一个官方教程了。可以先看看tutorial.thrift,这是thrift定义的语法,就是通过它来生成各种代码的了。

 

生成代码开始啦,使用之前下载的thrift-0.7.0.exe,在thrift-0.7.0\tutorial目录下执行命令

thrift-0.7.0.exe –r –gen py –gen java tutorial.thrift

搞定,在当前文件夹就产生两个文件夹了,分别是gen-java和gen-py。gen-java咱暂时用不着,生成来玩的:)如果你想生成更多其他类型的代码,–gen xxx就可以了。

3.运行

进入thrift-0.7.0\tutorial\py目录,在运行之前,先改一下PythonServer.py

不知道是我安装的thrift库有问题还是它的tutorial写错了,找到下面这行代码。

transport = TSocket.TServerSocket(9090)

把它改为

transport = TSocket.TServerSocket(port=9090)

好吧,双击运行服务端PythonServer.py。看到Starting the server就证明你成功运行服务端了!如果黑乎乎的窗口一闪而过,那看看哪一步做错了吧。用cmd运行看看。

 

接下来,再运行客户端PythonClient.py,这时就可以看到服务端有信息输出了~~成功!

 


下载新浪音乐

新浪音乐没有直接下载音乐的地方。。听到一首好歌想要下载怎么办呢··找出它的下载地址

只要你得到新浪音乐的短地址,就行啦。(你可以分享一条歌曲获得短地址)

http://fatkun.com/sina.php

这样就可以找出新浪音乐的下载地址,从此爽歪歪..

 


更换新主题

Zindi主题改了一下,主要是改了页面宽度,文字大小。。我还是喜欢14px的文字,看起来容易阅读。

悲剧的是发现评论不是嵌套的···o(╯□╰)o这个还没改。。

嵌套评论是必须的··怎么能木有呢···迟点试着改一下。。


Django values(*fields) 如何使用

官方文档:https://docs.djangoproject.com/en/1.3/ref/models/querysets/#values

1. values(*fields)

这个方法返回的是ValuesQuerySet,是QuerySet 的子类,也就是说,你可以用QuerySet里的方法。 需要注意的是,返回的不是list,不要直接当list来用了。对ValuesQuerySet遍历,每一个元素是“字典”dict。

当不传入参数时,返回这个model的所有字段

AppDef.objects.values()
[{'creator': u'admin''apptype_name': u'uc3g''apptype_chn_name': u'3G\u95e8\u6237''note': u'', ...},...]

当传入参数时,只会列出你指定的参数

AppDef.objects.values('apptype_name')
[{'apptype_name': u'uc3g'},...]

也可以加上filterfilter在前或者后面都是一样的

AppDef.objects.filter(pk=1).values('apptype_name')
AppDef.objects.values('apptype_name').filter(pk=1)

如果想把关联的字段也一起查出来
OneToOneField, ForeignKey 和ManyToManyField 关系的都可以。
ManyToManyField 在Django1.3版后才支持
LogTypeDef定义了一个appForeignKey

LogTypeDef.objects.filter(pk=6).values('pk''app__apptype_name')
[{'pk': 6L, 'app__apptype_name': u'wapsearch'}]

如果你只想拿到app_id,可以这样
下面三种方法都是一样的,只是返回的结果名字对应你的查询语句

LogTypeDef.objects.filter(pk=6).values('pk''app_id')
LogTypeDef.objects.filter(pk=6).values('pk''app')
LogTypeDef.objects.filter(pk=6).values('pk''app__id')

注意在关联关系为多对多的时候,它只会帮你一条一条的列出来,而不会帮你合并为一个list
例如会返回类型的结果:同一个pk并不会帮你合并app_id

[{pk: 6, app_id: 2}{pk: 6, app_id: 3}]

2. 注意事项

当同时使用distinct()和values(),需要注意order_by() (或者默认 model ordering) ,会自动加入select 中作为distinct项,所以返回的结果你以为是重复的,其实是order by的字段没列出来。
如果在extra() 之后用values(),一定要把extra用到的字段也加进来;如果extra()在values()之后,extra的字段会自动加进select。
Because ManyToManyField attributes and reverse relations can have multiple related rows, including these can have a multiplier effect on the size of your result set. This will be especially pronounced if you include multiple such fields in your values() query, in which case all possible combinations will be returned. (这个不太懂什么意思,应该是当values有多个manytomanyfield的时候,会尽量合并一些)

3. 适用范围

l 只需要返回dict,而不需要返回model object
l 只需要返回简单的数据(包括层次简单)

4. Values_list

values一样,只是返回的不是字典而是元组。