1 //支持bind綁定store 2 //列表搜索擴展,支持本地查詢 3 //支持樹形菜單本地一級菜單查詢 4 Ext.define('ux.form.field.SearchField', { 5 extend: 'Ext.form.field.Text', 6 alias: 'widget.uxSearchfield', 7 defaultBindProperty: 'store', 8 mixins: ['Ext.util.StoreHolder'], 9 triggers: { 10 clear: { 11 weight: 0, 12 cls: Ext.baseCSSPrefix + 'form-clear-trigger', 13 hidden: true, 14 //清除搜索條件 15 handler: 'clearValue', 16 scope: 'this' 17 }, 18 search: { 19 weight: 1, 20 cls: Ext.baseCSSPrefix + 'form-search-trigger', 21 //查詢 22 handler: 'onSearchClick', 23 scope: 'this' 24 } 25 }, 26 //查詢參數 27 paramName: 'query', 28 //是否本地查詢 29 isLocal: false, 30 initComponent: function () { 31 var me = this, 32 store = me.store; 33 me.on({ 34 //添加監聽,監聽回車鍵 35 specialkey: function (f, e) { 36 if (e.getKey() == e.ENTER) { 37 me.onSearchClick(); 38 } 39 }, 40 //監聽內容改變 41 //在這裏監聽是爲了實現多個搜索控件綁定同一個store時 42 //界面可以同步 43 change: function (t, value) { 44 var clear = t.getTrigger('clear'); 45 //根據查詢條件是否存在,顯示隱藏小按鈕 46 if (value.length > 0) { 47 if (clear.hidden) { 48 clear.show(); 49 t.updateLayout(); 50 } 51 } else { 52 clear.hide(); 53 t.updateLayout(); 54 me.onClearClick(); 55 } 56 } 57 }); 58 //若是strong是string類型,尋找對應的store 59 if (Ext.isString(store)) { 60 store = me.store = Ext.data.StoreManager.lookup(store); 61 } 62 //動態綁定store 63 me.bindStore(store || 'ext-empty-store', true); 64 me.callParent(arguments); 65 }, 66 //清除value 67 clearValue: function () { 68 this.setValue(''); 69 }, 70 //清除過濾 71 onClearClick: function () { 72 //console.log('清除過濾'); 73 var me = this, 74 activeFilter = me.activeFilter; 75 if (activeFilter) { 76 me.store.getFilters().remove(activeFilter); 77 me.activeFilter = null; 78 } else { 79 me.store.clearFilter(false); 80 } 81 }, 82 //本地過濾 83 localFilter: function (value) { 84 var store = this.store, 85 paramName = this.paramName; 86 87 //first clear any current filters on the store. If there is a new value, then suppress the refresh event 88 store.clearFilter(!!value); 89 //check if a value is set first, as if it isnt we dont have to do anything 90 //the user could have entered spaces, so we must split them so we can loop through them all 91 var searches = value.split(','), 92 regexps = [], 93 i, regex; 94 95 //loop them all 96 for (i = 0; i < searches.length; i++) { 97 //if it is nothing, continue 98 if (!searches[i]) continue; 99 100 regex = searches[i].trim(); 101 regex = regex.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); 102 103 //if found, create a new regular expression which is case insenstive 104 regexps.push(new RegExp(regex.trim(), 'i')); 105 } 106 107 //now filter the store by passing a method 108 //the passed method will be called for each record in the store 109 store.filter(function (record) { 110 //樹形菜單隻過濾第一層 111 if (record.get('depth') > 1) { 112 return true; 113 } 114 var matched = []; 115 116 //loop through each of the regular expressions 117 for (i = 0; i < regexps.length; i++) { 118 var search = regexps[i], 119 didMatch = search.test(record.get(paramName)); 120 121 //if it matched the first or last name, push it into the matches array 122 matched.push(didMatch); 123 } 124 125 return (regexps.length && matched.indexOf(true) !== -1); 126 }); 127 }, 128 //過濾 129 onSearchClick: function () { 130 var me = this, 131 value = me.getValue(), 132 store, 133 proxy; 134 if (value.length > 0) { 135 //本地仍是遠程過濾 136 if (!me.isLocal) { 137 store = me.store; 138 store.setRemoteFilter(true); 139 // 設置代理,設置過濾參數 140 proxy = store.getProxy(); 141 proxy.setFilterParam(me.paramName); 142 proxy.encodeFilters = function (filters) { 143 return filters[0].getValue(); 144 } 145 // Param name is ignored here since we use custom encoding in the proxy. 146 // id is used by the Store to replace any previous filter 147 me.activeFilter = new Ext.util.Filter({ 148 property: me.paramName, 149 value: value 150 }); 151 me.store.getFilters().add(me.activeFilter); 152 } else { 153 me.localFilter(value); 154 } 155 } 156 }, 157 onDestroy: function () { 158 //清除過濾條件 159 var me = this, 160 store = me.store; 161 if (store) { 162 me.onClearClick(); 163 me.store = null; 164 //移除綁定 165 me.bindStore(null); 166 } 167 me.callParent(); 168 } 169 });
簡單示例express
1 Ext.define('類名', { 2 extend: 'Ext.tree.Panel', 3 title: '小區', 4 rootVisible : false, 5 store: '數據源,可bind綁定', 6 header: { 7 items: [{ 8 //本地查詢 9 isLocal:true, 10 xtype: 'uxSearchfield', 11 // 12 store: '數據源,可bind綁定', 13 // 14 paramName: '查詢字段', 15 emptyText: '請輸入關鍵詞' 16 }] 17 } 18 });