先不多说,上代码(关键代码):
tbar : ['poolId:',{ xtype : 'combo', id : 'poolId', name : 'pool', editable : true, value : '', store : Ext.getStore('poolStore'), displayField : 'poolName', valueField : 'poolValue', matchFieldWidth: false, //queryMode: 'remote', triggerAction:'all', listConfig : { loadingText: 'Loading...', width: 200, autoHeight:true }, listeners : { 'select' : function(obj,records,options){ Ext.getCmp('triggerId').clearValue(); var triggerStore = Ext.data.StoreManager.lookup('triggerStore'); triggerStore.getProxy().extraParams['criteria.poolId'] = obj.getValue(); triggerStore.load(); } } },'-','triggerId:',{ xtype : 'combo', id : 'triggerId', name : 'trigger', editable : true, value : '', store : Ext.getStore('triggerStore'), displayField : 'triggerName', valueField : 'triggerValue', matchFieldWidth: false, queryMode: 'local', triggerAction:'all', listConfig : { loadingText: 'Loading...', width: 200, autoHeight:true } },'-',{ text : '查询', iconCls : 'icon-search', action : 'select' }]
上面的代码主要是grid上的tbar部分,这里有几点需要注意。配置项store : Ext.getStore('poolStore'),这里是根据storeId获取store对象,因为我这里使用的是Ext4的MVC模式,这里贴出store部分代码(该部分代码在controller中):
Ext.create('Kira.store.PoolStore', { storeId : 'poolStore' });
定义store的代码如下:
Ext.define('Kira.store.PoolStore', { extend : 'Ext.data.Store', model : 'Kira.model.PoolStore', remoteFilter : true,//远程过滤 remoteSort : true,//远程排序 proxy : { type : 'ajax', url : 'triggerMetadata/getAllPoolIdList.action', actionMethods : { read : 'POST' }, extractResponseData : function(response){ var jsonArr = [],jsonObj = {}; var resp =Ext.decode(response.responseText); var resultData = resp["resultData"];//the rows object for(var i=0,len = resultData.length;i<len;i++){ jsonObj['poolValue']=resultData[i]; jsonObj['poolName']=resultData[i]; jsonArr.push(jsonObj); jsonObj = {}; } return jsonArr; }, reader : { type : 'json', root : 'resultData' } } });
这里由于项目的原因,后端返回的数据并不是标准格式,笔者在这里重写了Ext的方法 : extractResponseData, 该方法在源代码里定义如下:
/** * Template method to allow subclasses to specify how to get the response for the reader. * @template * @private * @param {Object} response The server response * @return {Object} The response data to be used by the reader */ extractResponseData: function(response) { return response; },
该方法很简单,只是简单返回 response对象,注释里说明了该方法允许子类根据需要重写该方法。这里要返回如下格式的数据即可:
{ "contextData":{ "paging":{ "currentPage":1, "currentResultNum":0, "firstPage":0, "firstResult":0, "firstRownum":1, "inited":false, "lastPage":0, "lastRownum":2147483647, "maxResults":2147483647, "totalResults":0 } }, "resultData":["yihaodian/web-pool-simulator"] }
定义Model比较简单:
Ext.define('Kira.model.PoolStore', { extend : 'Ext.data.Model', fields : ['poolValue', 'poolName'] });
tbar里的另外的配置项:queryMode和之前版本的mode一样,listConfig配置项主要是定义combo下拉框,一般来说,默认情况下,下拉框的宽度和combo输入框的宽度是一样的,这里的配置项可以让你定制下拉框的宽度等。这里select部分:
'select' : function(obj,records,options){ Ext.getCmp('triggerId').clearValue(); var triggerStore = Ext.data.StoreManager.lookup('triggerStore'); triggerStore.getProxy().extraParams['criteria.poolId'] = obj.getValue(); triggerStore.load(); }
是联动的关键,当选择第一个combo时,要清空第二个要级联的combo,然后传递该下拉选择值。这里将第一个combo要注意的部分都贴出来了,第二个下拉框类似,不再赘述。
效果如图: