[ExtJs] ComboBox 禁止搜索自動選中

在ExtJs 提供的field控件裏,有個comboBox控件,此控件相較selectfield 多了個最常用的搜索方法

像如下一樣進行過濾搜索:

也就是ComboBox 是個自帶搜索過濾可編輯下拉框

想實現 搜索過濾 使用queryMode 配置項即可。

若是想在前端本地過濾,也就是把下拉項的數據提前加載好,可使用 queryMode:'local' 配置,如下:

{
         xtype: 'combobox',
         label: '可過濾搜索的Demo',
         queryMode: 'local',//配置爲本地過濾 也就是前端過濾
         displayField: 'showVal',
        valueField: 'realVal',
        displayTpl: '{showVal}',
         
         store: [
             { realVal: 'A', showVal: '選項一' },
             { realVal: 'B', showVal: '選項二' },
             { realVal: 'C', showVal: '選項三' },
             { realVal: 'D', showVal: '四' },
         ],
 }

這時,在輸入框內輸入的值 是過濾 displayField字段的值的,但是你會發現他過濾的都是值的首字母過濾。

若是想能模糊過濾或其他過濾方式,可通過配置primaryFilter 來設置自定義過濾方法

primaryFilter: {
    filterFn(record) {
        var value = this.getValue(),
        subject = record.get('showVal');
        if (Ext.isEmpty(value)) {
            return true;
        }
         
        return subject.indexOf(value) > -1;
    }
}

這裏也隱藏一個問題,當我們在輸入框裏輸入 valueFiled 綁定的值字段,例如 輸入“A”

發現ComboBox 會自動選定 value值爲 A 的那行記錄。若是我們監聽下select 事件會發現

{
    xtype: 'combobox',
    label: '可過濾搜索的Demo',
    queryMode: 'local',
    displayField: 'showVal',
    valueField: 'realVal',
    displayTpl: '{showVal}',
     
    primaryFilter: {
        filterFn(record) {
            var value = this.getValue(),
            subject = record.get('showVal');
            if (Ext.isEmpty(value)) {
                return true;
                }
     
            return subject.indexOf(value) > -1;
        }
    },
    store: [
        { realVal: 'A', showVal: '選項一' },
        { realVal: 'B', showVal: '選項二' },
        { realVal: 'C', showVal: '選項三' },
        { realVal: 'D', showVal: '四' },
    ],
    listeners: {
        select: function (filed, rec) { console.log('select事件觸發') }
    }
}

只要在combobox 裏輸入值,控制檯就會輸出 select事件觸發 監聽 rec 參數發現

當輸入值 valueField 列 綁定的值時,rec有個isEntered 參數且爲true

而當輸入的值爲 store裏綁定的值,例如輸入“A”rec 就是 {realVal:'A',showVal:'選項一'} 此行數據。且無isEntered參數

如果我們想限定,必須通過手動點擊選擇的或者使用Enter鍵確認的,才能作爲選中值,可以配置forceSelection 爲true

存在的隱性問題

但是這個設置後,發現個問題,comBoBox 無法自定義設置值了

如果想實現既可以判定是手動選擇又可以自定義鍵入,可以考慮自定義方法,如下,監聽picker的childtap事件來實現。

{
    xtype: 'combobox',
    label: '可過濾搜索的Demo',
    queryMode: 'local',
    displayField: 'showVal',
    valueField: 'realVal',
    displayTpl: '{showVal}',
    //forceSelection:true,//將固定選擇 去除
    primaryFilter: {
        filterFn(record) {
            var value = this.getValue(),
            subject = record.get('showVal');
            if (Ext.isEmpty(value)) {
                return true;
                }
     
            return subject.indexOf(value) > -1;
        }
    },
    store: [
        { realVal: 'A', showVal: '選項一' },
        { realVal: 'B', showVal: '選項二' },
        { realVal: 'C', showVal: '選項三' },
        { realVal: 'D', showVal: '四' },
    ],
    listeners: {
        pickercreate:function(sender, picker) {//在picker創建後的事件裏 綁定childtap
            picker.on({
                childtap:function(picker, location) {
                    if(location.record) {
                        picker.getRefOwner().fireEvent('userselect', null, location.record);//自定義一個userselect事件
                    }
                }
            });
        },
        userselect: function (filed, rec) { console.log('真實點擊選中觸發的') }
    }
}

若是想實現服務端搜索過濾,可參考ExtJs ComboBox 服務端搜索過濾

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章