mthoutai

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

封装的是一个Ext4.2的组件,继承并兼容于Ext的ComboBox.

实现原理非常easy,在 combo 中监听 keyup 事件就可以.

    搜索建议的Combo.基本上全然兼容, 使用方式与Combo下拉框一样.
    须要后台程序依据keyword进行搜索建议.

源代码例如以下: 

// 搜索建议框,使用时请适当改动包名
Ext.define("CNC.view.SearchComboBox",{
    extend: "Ext.form.field.ComboBox",
    alias : ["widget.searchCombo", "widget.searchComboBox", ],
    editable: true,
    enableKeyEvents : true,
    searchWordKey : "keyword", // 搜索的属性名称
    searchSizeKey : "searchSize", // 传递数量的KEY
    searchSize : 5, // 返回的数量
    initComponent : function() {
        //
        var keyup = "keyup";
        this.addListener(keyup, this.keyupFn, this)
        this.callParent();
    }
    , keyupFn : function(combo, e){
        //
        var store = this.getStore && this.getStore();
        if(!store){  return; }
        //
        var proxy = store.getProxy();
        if(!proxy){ return; }
        // 获取输入的文本内容
        var text = this.getRawValue() || "";
        // 设置到參数里面
        var extraParams = proxy.extraParams || {};
        proxy.extraParams = extraParams;
        //
        var searchWordKey = this.searchWordKey;
        var searchSizeKey = this.searchSizeKey;
        var searchSize = this.searchSize || 5;
        // 设置到參数里面
        extraParams[searchWordKey] = text;
        extraParams[searchSizeKey] = searchSize;

        // 使用 store 载入
        store.load();
    }

});


组件使用配置:

    {
        xtype: 'searchCombo',
        fieldLabel: 'XXXX属性',
        name: 'xxxxName',
        editable: true,
        displayField: 'xxxName',
        valueField: 'xxxID'
        searchWordKey : "keyword", // 搜索的属性名称
        searchSizeKey : "searchSize", // 传递数量的KEY
        searchSize : 5, // 返回的数量
        store: Ext.create('XXX.xxx.xxxStore', {
            proxy : {
                type: 'ajax',
                api : {
                    read : 'xxx/xxx/listBy.json'
                },
                actionMethods: {
                    read   : 'POST'
                },
                reader: {
                    type: 'json',
                    root:'data',
                    totalProperty: 'totalCount',
                    messageProperty:'message'
                },
                extraParams: {
                    xxxname : 'xxxvalue'
                }
            }
        })
    }

Contoller 使用方式, 相似以下这样:

 var acType = "";
 var acTypeName = "";
 var acTypeCombo = XXXForm.query('searchCombo[name=acType]')[0];
 if(acTypeCombo){
	acType = acTypeCombo.getValue();
	acTypeName = acTypeCombo.getRawValue();
}
假设要监听事件,应该监听 select 事件:
 select(combo, records, eOpts )
欢迎留言。

说明: 仅仅支持远程载入的Store。

当然,也能够进行定制。如监听多个事件:

    initComponent : function() {
        //
        var keyup = "keypress";
        var change = "change";
        var active = "active";
        this.addListener(keyup, this.keyupFn, this)
        this.addListener(change, this.keyupFn, this)
        this.addListener(active, this.keyupFn, this)
        this.callParent();
    }

还能够对反复的文本进行拦截,避免过多请求:

        // 获取输入的文本内容
        var text = this.getRawValue() || "";
        text = text.trim();//.replace(/\w/g, "");
        if(text == this.prevKeyWord){
            return;
        }
        //
        this.prevKeyWord = text;
上面代码中凝视掉的部分, 是用正則表達式将数字字母给清理掉,有些中文输入法会有这样的问题。
此外,你还能够使用延迟函数,比方500毫秒之内仅仅触发一次。有些时候会非常实用的,这就须要你自己来实现啦。



posted on 2017-08-16 21:47  mthoutai  阅读(641)  评论(0编辑  收藏  举报