论坛首页 入门技术论坛

Extjs 两个JsonStore 使用同一个url(action)时问题

浏览 11331 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (8) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-09-22   最后修改:2009-09-22
困扰了我很久的问题,在网上找找,也没找解决办法。

问题是,我在一个页面上有两个ComboBox,数据来源是同一个action(我使用的struts2)
还是看看代码吧
var store_comBox_volt = new Ext.data.JsonStore({
         url : "dropAction!getVoltDrop.action",
	root : 'volt',
	fields : ['id', 'name']
	});
store_comBox_volt.load()
var comBox_volt = new Ext.form.ComboBox({ // combobox
	fieldLabel : '电压等级',
	displayField : 'key',
	width:'50',
	mode : 'local',
	store : store_comBox_volt,
	displayField : 'name',
	valueField : 'id',
	forceSelection : true,
	triggerAction : 'all',
	selectOnFocus : true,
	typeAhead : true
	});


 var store_comBox_org = new Ext.data.JsonStore({
						url : "dropAction!getOrgsDrop.action",
	root : 'orgs',
	fields : ['id', 'name']
	});	
store_comBox_org.load();
var comBox_org = new Ext.form.ComboBox({ // combobox
	fieldLabel : '管理单位',
	displayField : 'key',
	mode : 'local',
	store : store_comBox_org,
	displayField : 'name',
	forceSelection : true,
	triggerAction : 'all',
	selectOnFocus : true,
	typeAhead : true
	 });

后台处理正常,但在页面上不显示。不知道什么原因。后来,在网上看到:EXT用定时检查的方法处理连接是否正常结束的问题,每50毫秒一次。
我就在store_comBox_org上加一个定时器。
setTimeout(function(){store_comBox_volt.load()},100);
这样就正常了。
   发表时间:2009-09-22  
var store_comBox_volt = new Ext.data.JsonStore({
         url : "dropAction!getVoltDrop.action",
	root : 'volt',
	fields : ['id', 'name']
	});

var comBox_volt = new Ext.form.ComboBox({ // combobox
	fieldLabel : '电压等级',
	displayField : 'key',
	width:'50',
	mode : 'local',
	store : store_comBox_volt,
	displayField : 'name',
	valueField : 'id',
	forceSelection : true,
	triggerAction : 'all',
	selectOnFocus : true,
	typeAhead : true
	});
//move
store_comBox_volt.load()

 var store_comBox_org = new Ext.data.JsonStore({
						url : "dropAction!getOrgsDrop.action",
	root : 'orgs',
	fields : ['id', 'name']
	});	

var comBox_org = new Ext.form.ComboBox({ // combobox
	fieldLabel : '管理单位',
	displayField : 'key',
	mode : 'local',
	store : store_comBox_org,
	displayField : 'name',
	forceSelection : true,
	triggerAction : 'all',
	selectOnFocus : true,
	typeAhead : true
	 });
//move
store_comBox_org.load();
0 请登录后投票
   发表时间:2009-09-23   最后修改:2009-09-23
store_comBox_volt.load()  

放在comBox_volt后也不行。
我又试了试,comBox_volt.getStore().load()
还是有问题。点击下拉框不显示。

我在调试的时候,加一个断点或使用alert(),停顿一下就可以了。我才想到使用setTimeout。
估计是异步惹的祸。

不知道什么原因。
0 请登录后投票
   发表时间:2009-09-23  
mode : 'local', .....
0 请登录后投票
   发表时间:2009-09-23   最后修改:2009-09-23
谢谢你的回复,不是没加mode : 'local'引起的问题,

今天又调试了一下午,怀疑不是事extjs的问题。

我在action中直接输出需要的字符串,没有问题。但是有hibernate取就有问题。

怀疑和hibernate有关。两个并发的线程使用同一个session。

我的实验是把取数据部分去掉,直接把要输出的字符串out出来,就一切正常。使用hibernate取数据就有问题。
	public String getVoltDrop() throws Exception {
		try {
/*			List<TpParaVolt> list = dropServ.getVoltDropList();
			JSONArray jsonArray = new JSONArray();
			Iterator iterator = list.iterator();
			while (iterator.hasNext()) {
				TpParaVolt volts = (TpParaVolt) iterator.next();
				Map map = new HashMap();
				map.put("id", volts.getVoltCode());
				map.put("name", volts.getVoltName());
				jsonArray.add(map);
			}
			super.outJsonArray(jsonArray, "volt");*/
			String str="{\"volt\":[{\"id\":\"2\",\"name\":\"220\"},{\"id\":\"5\",\"name\":\"500\"},{\"id\":\"AC00101\",\"name\":\"10kV\"},{\"id\":\"AC00351\",\"name\":\"35kV\"},{\"id\":\"AC00661\",\"name\":\"66kV\"},{\"id\":\"AC01101\",\"name\":\"110kV\"},{\"id\":\"AC02201\",\"name\":\"220kV\"},{\"id\":\"AC05001\",\"name\":\"500kV\"},{\"id\":\"AC07501\",\"name\":\"750kV\"}]}";
			super.outJsonString(str);

		} catch (Exception e) {
			logger.debug("showNode执行失败!" + e);
			e.printStackTrace();
		}
		return null;
	}





0 请登录后投票
   发表时间:2009-09-24  
用firebug看ajax的response即知
0 请登录后投票
   发表时间:2009-09-24   最后修改:2009-09-24
看了一下,
第一个请求的数据返回到第二个里了。

管理单位和电压等级的数据是两个请求,第一个请求返回为空,第二个请求返回的是管理单位和电压等级两个数据。


本来应该是orgs返回管理单位的请求里,现在都在电压等级的请求了里返回了,并且volt还返回两个。

{"orgs":[{"id":"440000","name":"???????"},{"id":"SS0000","name":"?????"},{"id":"CC0000","name":"??????"},{"id":"450000","name":"???????"},{"id":"460000","name":"??????"},{"id":"520000","name":"??????"},{"id":"530000","name":"??????"}]}

{"volt":[{"id":"2","name":"220"},{"id":"5","name":"500"},{"id":"AC00101","name":"10kV"},{"id":"AC00351","name":"35kV"},{"id":"AC00661","name":"66kV"},{"id":"AC01101","name":"110kV"},{"id":"AC02201","name":"220kV"},{"id":"AC05001","name":"500kV"},{"id":"AC07501","name":"750kV"}]}

{"volt":[{"id":"2","name":"220"},{"id":"5","name":"500"},{"id":"AC00101","name":"10kV"},{"id":"AC00351","name":"35kV"},{"id":"AC00661","name":"66kV"},{"id":"AC01101","name":"110kV"},{"id":"AC02201","name":"220kV"},{"id":"AC05001","name":"500kV"},{"id":"AC07501","name":"750kV"}]}


我使用延迟请求的方式,有时也不行。大部分可以。
郁闷!不知道怎么解决了。
0 请登录后投票
   发表时间:2009-09-24  
你2个store里的root不一样
0 请登录后投票
   发表时间:2009-09-24  
1.jsonStore定义的时候autoLoad设置为true
2.mode="remote"
试试看行不
0 请登录后投票
   发表时间:2009-09-25   最后修改:2009-09-25
我觉得是extjs 并行执行取数据的原因。我现在改成串行的就解决了。

我是这样解决的:
在第一个load()上加一个callback()。让第一个load返回后再执行下一个load。
这样就可以了,就是效率第一点。并且感觉也不是最好的解决方法。如果有四个五个的,就要增加很到代码,还加深了程序的耦合,不利于维护。

不知谁有更好的解决方法?
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics