zoukankan      html  css  js  c++  java
  • ux.form.field.SearchField 列表、树形菜单查询扩展

      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 });

    简单示例

     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 });
  • 相关阅读:
    寒假学习第九天
    寒假学习第八天
    寒假学习第七天
    寒假学习第六天
    寒假学习第五天
    寒假学习第四天
    寒假学习第三天
    寒假学习第二天
    寒假学习第一天
    阅读笔记
  • 原文地址:https://www.cnblogs.com/mlzs/p/5595778.html
Copyright © 2011-2022 走看看