Ext下拉联动遇到的问题
业务需求:
1、下拉是动态配置的(根据不同部门配置不同的产品);
2、需要对下拉设置默认值(默认值有一定的排序规则);
3、受另外一个勾选框的影响,勾选之后,下拉的值会变化,比如:原本下拉内容为a、b、c、d,勾选之后,变为e、f、g;
4、此下拉框A会影响另外一个下拉框B,两者是联动的;
5、有导入功能,可以导入单子,并且实现导入的数据和手动选择的数据一样效果;
6、导入数据之后还不能影响页面原有事件。
具体实现方案
1:在store的load事件上绑定渲染,这里按照排序设置默认值,处理时在后台排序好,在前端直接设置第一条数据,js如下
store: me.getProductTypeStore(),
listeners: {
change: {fn: me. onValueChange, scope: me},
render : function(combo) {
combo.getStore().on( "load", function(s, r, o) {
combo.up('panel' ).setDefaultProduct(combo,s,r,o);
});
}
渲染方法如下:
setDefaultProduct:function(combo,s,r,o){
var me = this;
var productid = me.getForm().findField('productId' );
combo.setValue(r[0].data.dictCode);
productid.setValue(r[0].data.id);
}
PS:为什么绑定在load上,因为只有在load之后,数据才能加载,也就是说store的data里面才有数据,否则数据设置不上去
因为在load方法上加载的有事件,所以,所有页面上对此下拉的值的变动,都不能用load去加载,而需要用Jquery请求到数据进行自行组装,然后使用loadData方法加载,代码如下:
Ext.Ajax.request({
params:{ 'param.isxxx':'Y'},
url: create.fullPath('xxx.action' ),
async: true,
success: function(response){
json =Ext.decode(response.responseText);
var addItems = [];
for( var i=0;i<json.listProduct.length;i++){
var model = Ext.create('dictionaryModel' );
model.set( 'id', json.listProduct[i].id);
addItems.push(model);
}
productTypeStore.loadData(addItems);
if(addItems.length==0){
me.getMainContainerPanel().getMsgUtil().showError("" );
return;
} else{
productType.setValue(json.listProduct[0].productType);
productid.setValue(json.listProduct[0].id);
}
}
});
3、因为这个下拉框有和另外一个下拉框联动,所以绑定的有change事件,在导入的时候,重新加载此下拉框以及设置下拉框的值都会触发change事件,并且,change事件是监听形式的,是异步的形式进行处理,很多时候会出现,本身导入设置的值为A,但是因为异步的load事件加载而把值改为B,又触发了下拉框的change事件,导致导入数据有误!
这时候的处理方法是,在导入订单的时候,临时去掉可以改变下拉框的所有事件、去掉下拉框的change事件,进行复制以及其他判断,之后再绑定对应的时间,代码如下:
form.findField( 'xxxx.xxxxxx').un({
change: {fn: me.getMainContainerPanel().getWaybillBasicPanel().onValueChange, scope: me.getMainContainerPanel().getWaybillBasicPanel()}
});
form.findField( 'xxxx.xxxxxx').on({
change: {fn: me.getMainContainerPanel().getWaybillBasicPanel().onValueChange, scope: me.getMainContainerPanel().getWaybillBasicPanel()}
});
其中如果需要重新加载下拉框的值,则也进行jquery形式,手动loadData!
但这样又会出现加载值触发change事件,而清除了后续的其他内容,所以我们的处理是,在导入时给予一个标示,在change事件中判断此标识是否存在,如果存在,则不处理change,否则就处理,并且在导入逻辑完成后,清除这个标识,这段判断写在了ajax方法里面,是为了让这块逻辑同步执行,避免触发change事件时,这里因为没有走完,而导致值加载错误的问题。这个就不帖代码了。