ExtJs 在gridPanel中每一行内combobox的二级联动

ExtJs 在gridPanel中每一行内combobox的二级联动

前置

  1. extjs版本 3.X
  2. 前端没有html代码,都是由extjs写就,最后渲染而成

需求

一个gridPanel中的每一行都有两列是combobox,这两个combobox是联动的,且行与行之间不应该相互影响

效果如图,显示的是第一级combobox
在这里插入图片描述

初始解决方法

为第一个combobox添加“select”事件,将选中的参数(我的是id)传递给第二个combobox,让第二个combobox的数据顺利加载

   com1.on("select",function(thisCom,rds,index){
   	com2.getStore().baseParams["id"] = thisCom.getValue();
   	com2.getStore().load();
})

如此可以实现combobox的二级联动,但存在问题。

问题

此时的二级联动会存在行与行之间的相互影响,即选择第一行的第一个combobox后,直接选择第二行的第二个combobox,发现,此时第一行的第一个combobox和第二行的第二个combobox联动。有问题!!!

原因分析

查看被渲染后的html(IE 11环境),发现combobox最终被渲染成input,且只有当出现下拉框的时候才会是input,否则不是。如图:

  1. 此为第一行未选中渲染后的html(未出现下拉框,没选择,所以没文字)
    在这里插入图片描述
    2.此为第二行被选中后渲染成的html(出现下拉框)
    在这里插入图片描述
    由此,可得结论,实际上整个gridPanel中(无论多少行)只有两个combobox,仅当被选中(出现下拉框)时,才会被渲染成input。

解决方法

  1. 搞一个数组,用于记录第一个combobox被选中的参数,数组的下标为当前行的行号。
  2. 为第二个combobox添加beforeQuery事件,从数组中取出对应行的参数,然后再加载数据。
com1.on("select",function(thisCom,records,index){
				var nowRow = gridPanel.getSelectionModel().getSelected();
				var nowRowIndex = gridPanel.getStore().indexOf(nowRow);
				ids[nowRowIndex] = thisCom.getValue();
			 });
com2.on("beforequery",function(e){
				var combo = e.combo;
				var nowRow_T = gridPanel.getSelectionModel().getSelected();
				var nowRowIndex_T = gridPanel.getStore().indexOf(nowRow_T);
				if(ids[nowRowIndex_T] != undefined && ids[nowRowIndex_T] != null){
					
					delete combo.lastQuery;//清除上一次combobox加载的数据缓存
					combo.getStore().baseParams["参数"] = ids[nowRowIndex_T];
					combo.getStore().load();
					combo.clearValue();
					combo.setValue("");
					combo.setRawValue("");
				});

删除表格中的某一行出现的问题

  1. 删除某一行后,联动发送紊乱,即有四行:1,2,3,4
    删除第三行后,变为1,2,4(以为的),此时选择第四行的第二个combobox,却出现原来第三行的数据。
    原因:当某一行被删除后,gridPanel会对其内的数据进行重排,所以第三行被删除后,实际上是1,2,3(原来的第四行)
    解决方法:获取被删行的行号,从此行开始,将参数数组的每一个向前移动 1.
  2. 某一行被删除后,有一些二级combobox的显示值不能显示,但实际值是正常使用的,即RawValue不能显示,value正常。
    原因:gridPanel发送重排,但是之前的数据缓存被清除了,仅仅记录了value值(和gridPanel的col设置的dataIndex对应)
    解决方法:
  3. 只store.remove(),但不commitChange()
  4. 重新加载所有的二级combobox的值(即此时不考虑一级combo的影响)以获得文字.
  5. 在二级combobox的beforeQuery中恢复一二级联动.
  if(retstr=="success"){
  					Ext.Msg.alert("提示","删除成功!");
  					var index_D = store.indexOf(rd);//rd为选中的数据行
  					
  					store.remove(rd);
  			        	
  				
  					//从index_D开始,依次将ids中的id向前移动一位,防止重排后,选中行与ids中的不一致
  					//导致combobox联动出错
  					for(var k = index_D; k < ids.length-1;k++){
  						ids[k] = ids[k+1];
  					}
  					ids[k+1] = undefined;
  					com2.getStore().baseParams["flag"] = "all";//传递参数以获取所有属于二级的数据
  					com2.getStore().reload();		                   
  				}

最后

在保存成功后,应当将参数数组重置,
在修改进入后,应该将参数数组恢复,方法是给gridPanel的store添加 load事件的回调,将加载的数据写入参数数组中。

如果某问看官有更好的解决办法,留个地址,感谢!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值