jqueryEasyUI中两个combobox加载同一个JSON数据源,其中一个不能够进行点击事件

今天项目中了这个奇怪的问题,之前没有遇到过,就到网上查了下资料,发现没有解释原因的,倒是有几个解决方案。但是我们搞开发的,光是知道结果可不行。当然牢记结论也很重要。
所以我先发解决方法现在前面,原因写在后面,有兴趣的可以看一下。

解决方法:

1,更新项目中jqueryeasyUI的版本,项目中使用的是1.4。更新到最新版本应该可以解决(我没有测试)

2,对这个JSON数据源进行如下操作

$.ajax({
	    type: "POST",
	    url: ctx +"/sys/team/findTeamByUserId.do?" + sessInfo,
	    data: JSON.stringify(paramMap),
	    contentType : "application/json;charset=utf-8",
	    dataType : "json",
		success : function(data) {
		    if(data.retFlag =='success'){
				var comboM = [];
		    	for (var i=0; i<data.rows.length; i++) {
		    		var obj = {};
		    		obj.id = data.rows[i].id;
		    		obj.name = data.rows[i].name;
		    		comboM.push(obj);
		    	}
		    	$("#teamid_select").combobox({
		    		data : comboM,
		    	    valueField:'id',
		    	    textField:'name'
		    	});
		    	//将数据源进行转换
		    	var newComboM = JSON.parse(JSON.stringify(comboM));
		    	$("#teamid_GJselect").combobox({
		    		data : newComboM,
		    	    valueField:'id',
		    	    textField:'name'
		    	});
		    }else{
				messagerAlert('提示',data.message,'info');
		    }
		},
		error : function(data) {
			onLoadError(data);
		}
	});

上面的关键是:生成一个新的JSON格式,并且这个格式和之前的数据源没有联系

var newComboM = JSON.parse(JSON.stringify(comboM));

下面开始分析原因。

通过打印加在前后的数据

if(data.retFlag =='success'){
				var comboM = [];
				var gcomboM = [];
		    	for (var i=0; i<data.rows.length; i++) {
		    		var obj = {};
		    		obj.id = data.rows[i].id;
		    		obj.name = data.rows[i].name;
		    		comboM.push(obj);
		    		gcomboM.push(obj);
		    	}
		    	$("#teamid_select").combobox({
		    		data : comboM,//加载后新增了一个domId属性
		    	    valueField:'id',
		    	    textField:'name',
		    	    onLoadSuccess: function() {
				    	$("#teamid_GJselect").combobox({//执行到这一步的时候,comboM这个值为message:"comboM is not defined"
				    		data : gcomboM,//这里也多了一个domId的属性,
				    	    valueField:'id',
				    	    textField:'name'
				    	});
		    	    }
		    	});

加载前:

0: {
	id: 4,
	name: "测试2"
}
1: {
	id: 5,
	name: "水水水水"
}
2: {
	id: 6,
	name: "测试3"
}
3: {
	id: 7,
	name: "测试4"
}
4: {
	id: 8,
	name: "ceshi5"
}
5: {
	id: 9,
	name: "测试6"
}
6: {
	id: 10,
	name: "测试7"
}
7: {
	id: 11,
	name: "水水水水1"
8: {
	id: 12,
	name: "c啊啊啊"
}

 加载后:

0: {
	id: 4,
	name: "测试2",
	domId: "_easyui_combobox_175"
}
1: {
	id: 5,
	name: "水水水水",
	domId: "_easyui_combobox_176"
}
2: {
	id: 6,
	name: "测试3",
	domId: "_easyui_combobox_177"
}
3: {
	id: 7,
	name: "测试4",
	domId: "_easyui_combobox_178"
}
4: {
	id: 8,
	name: "ceshi5",
	domId: "_easyui_combobox_179"
}
5: {
	id: 9,
	name: "测试6",
	domId: "_easyui_combobox_180"
}
6: {
	id: 10,
	name: "测试7",
	domId: "_easyui_combobox_181"
}
7: {
	id: 11,
	name: "水水水水1",
	domId: "_easyui_combobox_182"
}
8: {
	id: 12,
	name: "c啊啊啊",
	domId: "_easyui_combobox_183"
}

通过上面的对比可以知道,是comboM在加载数据的时候修改了自身obj的数据。导致后面gcomboM也发生了变化。所以加载的时候属性domId发生冲突。意思就是comboM数组加载到 teamid_select下拉的时候会生成domId,但是由于此时gcomboM数组和comboM数组的数据源相同,导致gcomboM还没有加载到teamid_GJselect(本来应该加载后在生成domId的),就有了domId而且还和teamid_select相同

知道原因后,问题就好解决了。也就是说如果加载两个combobox加载同一个json源。那么使用两个没有关联的对象加载就可以了,比如通过两个循环,得到两个数组:

				for (var i=0; i<data.rows.length; i++) {
		    		var obj = {};
		    		obj.id = data.rows[i].id;
		    		obj.name = data.rows[i].name;
		    		comboM.push(obj);
		    	}
				for (var i=0; i<data.rows.length; i++) {
		    		var obj = {};
		    		obj.id = data.rows[i].id;
		    		obj.name = data.rows[i].name;
		    		gcomboM.push(obj);
		    	}

或者像其他的资料看到的,使用JSON.parse和JSON.stringify来解决,最终的目的就是使得两个数组没有关联;

参考资料:https://blog.csdn.net/u010479989/article/details/80590687

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值