Ext.form.ComboBox 实现两个ComboBox 的相互级联
想实现的功能是这样的:有两个下拉框,既想让第二个下拉框的内容根据第一个下拉框的选择结果load新值,也想让第一个下拉框根据第二个下拉框的选择结果重新load新值


最终的效果是这样的,我返回数据的时候都返回了一个 * 目的是,当我点 * 的时候 另一个下拉框的内容将全部展示出,因为我想实现互选,比如当我选了用户组后这时候应用组的内容已经变了,这时候我又想先选应用再选用户组,所以我再点一下 * 用户组的值又恢复了,源码如下,后台是python做的
function new_publish(published){ var user_group_store=new Ext.data.JsonStore({ url: '/apply/get_usergroup_list_for_publish',//去后台取数据,以字典形式返回的 root: 'rows', fields: ['name'], successProperty:'success', listeners:{ loadexception:function(obj,opts,res,e){ var store_response=Ext.util.JSON.decode(res.responseText); Ext.MessageBox.alert(_("Error"),store_response.msg); } } });user_group_store.load();var app_group_store=new Ext.data.JsonStore({ url: '/apply/get_application_group_list_for_publish', root: 'rows', fields: ['appgroup'], successProperty:'success', listeners:{ loadexception:function(obj,opts,res,e){ var store_response=Ext.util.JSON.decode(res.responseText); Ext.MessageBox.alert(_("Error"),store_response.msg); } } });app_group_store.load();//到这,我要的两个数据都有了 var select_appgroups = new Ext.form.ComboBox({ fieldLabel: _('Select AppGroups'), allowBlank:false, store: app_group_store, emptyText :_("Select AppGroups"), mode: 'local', displayField:'appgroup', valueField:'appgroup',// value:'*', width: 140, triggerAction :'all', forceSelection: true, name:'appgroups',readOnly:true,editable:false,// disabled : true,listeners:{select:function(combo,record,index){//这里实现的是根据我选的值让对应的下拉框值重新loadapp_group = record.get('appgroup');if(app_group =='*'){//给它一个新的url即可user_group_store.proxy.conn.url = '/apply/get_usergroup_list_for_publish';user_group_store.load();}else{user_group_store.proxy.conn.url = '/apply/get_user_group_list_for_appg?app_g='+app_group;user_group_store.load();}}} });var select_user_group = new Ext.form.ComboBox({ fieldLabel: _('Select User Group'), allowBlank:false, store: user_group_store, emptyText :_("Select User Group"), mode: 'local', displayField:'name', valueField:'name',// value:'*', width: 140, triggerAction :'all', forceSelection: true,readOnly:true,editable:false, name:'name',listeners:{ select:function(combo,record,index){user_group = record.get('name');if(user_group =='*'){app_group_store.proxy.conn.url = '/apply/get_application_group_list_for_publish';app_group_store.load();}else{app_group_store.proxy.conn.url = '/apply/get_application_group_list_for_ug?user_g='+user_group;app_group_store.load();} } } });var simple = new Ext.FormPanel({ labelWidth:120, frame:true, border:0, bodyStyle:'padding:0px 0px 0px 0px', labelAlign:"right" , width:315, height:110, labelSeparator: ' ', items:[select_user_group,select_appgroups] });simple.addButton(_("Publish"),function(){ if (simple.getForm().isValid()) {var usergp=select_user_group.getRawValue();var appgp=select_appgroups.getRawValue();if(usergp =='*'){Ext.MessageBox.alert(_('Error'), _('Please select a user group.'));}else if(appgp == '*'){Ext.MessageBox.alert(_('Error'), _('Please select a application group.'));}else{var url="/user/publish_group?user_group="+usergp+"&app_group="+appgp;var ajaxReq=ajaxRequest(url,0,"GET",true);ajaxReq.request({success: function(xhr) {var response=Ext.util.JSON.decode(xhr.responseText);if(response.success){published.store.reload();app_group_store.proxy.conn.url = '/apply/get_application_group_list_for_publish';app_group_store.load();user_group_store.proxy.conn.url = '/apply/get_usergroup_list_for_publish';user_group_store.load();// select_appgroups.store.reload();// select_user_group.store.reload();simple.getForm().reset();// select_appgroups.disable();Ext.MessageBox.alert(_("Success"),response.msg); }else{ Ext.MessageBox.alert(_("Failure"),response.msg); } }, failure: function(xhr){ Ext.MessageBox.alert( _("Failure") , xhr.statusText); } });} }else{ Ext.MessageBox.alert(_('Error'), _('Please select users and appgroups.')); } });return simple;//这里返回的就是整个这个框了,用的时候调一下就OK了}