Ext下拉联动遇到的问题

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事件时,这里因为没有走完,而导致值加载错误的问题。这个就不帖代码了。

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Doty1990

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值