原創文章,歡迎糾錯,轉載請註明出處
1.簡介
針對頁面中經常使用的2級、3級聯動抽象出一個聯動組件,目前支持一、二、3級下拉框,並可友好的擴展爲多級。
2.使用方法
可經過xtype直接使用,如下爲示例和源代碼 java
/** * 多級下拉框組件,目前支持一、二、3級 * e.g: { fieldLabel: "管理地區<font color='red'>*</font>", //設置label margin: '5px 0px 5px 20px', //邊距 xtype:'multiCombo', //類型 colspan:2, readOnly:false,//true即下拉框所有爲只讀 width:1000, config:{ //此處爲多級combo的配置 comboNumber:3, //combo數,若是爲3則需指定combo一、combo二、combo3的配置狀況 combo1:{//第一下拉框配置,此處配置項同extjs combo組件 name:'provinceCombo', fields:["provinceName","provinceCode"], data : [ #foreach($item in $provinceList) #if("$velocityCount"!="1"),#end {"provinceName":"$!item.locationName", "provinceCode":"$!item.locationCode"} #end ] },combo2:{//第二下拉框配置,此處配置項:name、fields同extjs combo組件 name:'cityCombo', fields:["cityName","cityCode"], //dataUrl爲第二下拉框的數據請求地址,在點擊下拉框時觸發請求,根據第一下拉框的值請求對應的值填充到下拉框。 //此處即根據省份的編碼取市級信息填充 dataUrl:'base-info!getCitysOfProvince.do?provinceCode=', parentEmptyMsg:'請選擇省份信息'//若沒有選擇第一下拉框的值就點擊此下拉框將彈出此提示 },combo3:{//第三下拉框配置 name:'regLocationId', editable:false,//是否可編輯,同extjs中的combo fields:["districtName","regLocationId"], dataUrl:'base-info!getDistrictsOfCity.do?cityCode=', parentEmptyMsg:'請選擇市級信息' } } } * @author sunpf * @date 2013-1-20 */ Ext.define('Glodon.gbmp.component.comp.combo.MultiCombo', { extend : 'Ext.form.FieldContainer', alias : 'widget.multiCombo', layout : 'hbox', width : '100%', config : null, parentItem : null,//第一下拉框 childItem1 : null,//第二下拉框 childItem2 : null,//第三下拉框 parentItemCode : null,//第一下拉框值的編碼,用於防止屢次請求相同的數據 childItem1Code : null,//第二下拉框值的編碼,用於防止屢次請求相同的數據 initComponent : function() { var me = this, mItems; mItems = me.createSelectItems(); me.items = mItems; me.callParent(); }, /** * 建立並初始化下拉選擇框 * @returns {Array} */ createSelectItems : function(){ var me = this; var selectItems = []; //1.生成第一下拉框 me.parentItem = me.createParentItem(me.config.combo1); selectItems.push(me.parentItem); if(me.config.comboNumber && me.config.comboNumber > 1 ){ //2.生成第二下拉框 me.childItem1 = me.createChildItem(me.config.combo2,me.parentItem,me.parentItemCode); selectItems.push(me.childItem1); if(me.config.comboNumber > 2){ //3.生成第三下拉框 me.childItem2 = me.createChildItem(me.config.combo3,me.childItem1,me.childItem1Code); selectItems.push(me.childItem2); //綁定事件,清空第三下拉框的值 me.childItem1.on('select',function(){ me.childItem2.clearValue(); me.childItem2.getStore().removeAll(); }); } //綁定事件,清空第2、三下拉框的值 me.parentItem.on('select',function(){ me.childItem1.clearValue(); me.childItem1.getStore().removeAll(); if(me.childItem2){ me.childItem2.clearValue(); me.childItem2.getStore().removeAll(); } }); } return selectItems; }, /** * 建立第一級下拉項 */ createParentItem : function(comboCfg){ var me = this,parentItem; parentItem = Ext.create('Ext.form.ComboBox', { name : comboCfg.name, fieldLabel : '', hideLabel : true, editable : comboCfg.editable==true?true:false, readOnly :me.readOnly == true?true:false, allowBlank : false, value:comboCfg.value, displayField : comboCfg.fields[0], valueField : comboCfg.fields[1], store : { fields: [comboCfg.fields[0], comboCfg.fields[1]], data : comboCfg.data }, queryMode: 'local' }); return parentItem; }, /** * 建立子下拉項 */ createChildItem : function(comboCfg,parentCombo,parentCode){ var me = this,childItem; childItem = Ext.create('Ext.form.ComboBox', { name : comboCfg.name, editable : comboCfg.editable==true?true:false, readOnly :me.readOnly == true?true:false, value : comboCfg.value, parentCombo : parentCombo, parentCode : parentCode, comboCfg : comboCfg, allowBlank : false, mode : 'local', displayField : comboCfg.fields[0], valueField : comboCfg.fields[1], store:{ fields: [comboCfg.fields[0], comboCfg.fields[1]], data : !comboCfg.data ? comboCfg : [], }, listeners : { 'expand' : function(combo){ if(combo.store.data.length == 0){ var value1 = combo.parentCombo.getValue(); if(!value1){ Ext.Msg.alert("提醒",combo.comboCfg.parentEmptyMsg); return false; } if(combo.parentCode == value1.trim()){ return false; } combo.parentCode = value1.trim(); var reqConfig = { url : combo.comboCfg.dataUrl + combo.parentCode, success : function(response,options) { combo.getStore().loadData(Ext.decode(response.responseText)); } }; Ext.Ajax.request(reqConfig); } } } }); return childItem; } });
3.擴展思路
經過這個組件爲咱們將系統中通用的小功能組件化提出了一種思路,經過繼承FieldContainer將幾個Extjs中的組件放入其中組合成咱們須要的功能組件,並經過定義數據和配置接口爲其提供數據和相關配置。ide