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