`
piaoyaohou
  • 浏览: 75748 次
  • 性别: Icon_minigender_1
  • 来自: 烟台
社区版块
存档分类
最新评论

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

阅读更多
困扰了我很久的问题,在网上找找,也没找解决办法。

问题是,我在一个页面上有两个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);
这样就正常了。
分享到:
评论
20 楼 piaoyaohou 2010-03-22  
偶然联想的这个问题的,最近翻翻spring参考手册, 学习了下bean的作用域。默认是singleton,就是在每个Spring IoC容器中一个bean定义对应一个对象实例。

使用prototype原型, 就是一个bean定义对应多个对象实例。 实际上不是New一个对象,是把对象克隆一下,对性能影响也不是很大。



19 楼 archerfrank 2010-03-19  
知道为什么么?
18 楼 piaoyaohou 2010-03-17  
自己解决了,使用原型模式就可以了。

我使用spring管理struts2的action
在spring配置文件中添加

scope="prototype"
17 楼 piaoyaohou 2009-10-13  
困扰了我很久的问题,在网上找找,也没找解决办法。

问题是,我在一个页面上有两个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
	 });

js代码已经贴出

我再把action贴出来。

@SuppressWarnings("unchecked")
public class DropAction extends BaseActionSupport {
	private DropServImpl dropServ;

	public void setDropServ(DropServImpl dropServ) {
		this.dropServ = dropServ;
	}

	/**
	 * 管理单位下拉
	 * 
	 * @return
	 * @throws Exception
	 */
	public String getOrgsDrop() throws Exception {
		try {
			String type = this.servletRequest.getParameter("type");
			// 调用业务
			List<TpParaOrgs> list = dropServ.getOrgDropList();
			JSONArray jsonArray = new JSONArray();
			Iterator iterator = list.iterator();
			while (iterator.hasNext()) {
				TpParaOrgs org = (TpParaOrgs) iterator.next();
				Map map = new HashMap();
				map.put("id", org.getOrgNo());
				map.put("name", org.getOrgName());
				jsonArray.add(map);
			}
			super.outJsonArray(jsonArray, "orgs");

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

	/**
	 * 电压等级下拉
	 * 
	 * @return
	 * @throws Exception
	 */
	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");

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

	/**
	 * 运行状态下拉
	 * 
	 * @return
	 * @throws Exception
	 */
	public String getRunStatusDrop() throws Exception {
		try {
			List<TpParaDetail> list = dropServ.getRunStatusDropList();
			JSONArray jsonArray = new JSONArray();
			Iterator iterator = list.iterator();
			while (iterator.hasNext()) {
				TpParaDetail paraDetail = (TpParaDetail) iterator.next();
				Map map = new HashMap();
				map.put("id", paraDetail.getId().getId());
				map.put("name", paraDetail.getName());
				jsonArray.add(map);
			}
			super.outJsonArray(jsonArray, "runStat");

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


}

16 楼 realcbb 2009-10-12  
我为什么没有出现你们的问题,能不能把整个js,还有Action贴出来,大家研究一下
15 楼 fireinjava 2009-10-11  
piaoyaohou 写道
困扰了我很久的问题,在网上找找,也没找解决办法。

问题是,我在一个页面上有两个ComboBox,数据来源是同一个action(我使用的struts2)
还是看看代码吧
var store_comBox_volt = new Ext.data.JsonStore({
         url : "dropAction!getVoltDrop.action",
	root : 'volt',
	fields : ['id', 'name']
。。。。。。。。。。。。

后台处理正常,但在页面上不显示。不知道什么原因。后来,在网上看到:EXT用定时检查的方法处理连接是否正常结束的问题,每50毫秒一次。
我就在store_comBox_org上加一个定时器。
setTimeout(function(){store_comBox_volt.load()},100);
这样就正常了。

我也遇到这问题,而且我是两个树同一个Action,并发下,
第一树传param.id=12,第二树传param.name='tom',可是有时候看它打印出来的Sql把两个条件并到一块了,成了
where id=12 and name='tom' 我郁闷了。。Action里面的是挺正常的,
若有答案了,烦楼主短信告知下,感谢 。
14 楼 piaoyaohou 2009-09-28  

没有使用jsonPlugin

我直接使用PrintWriter 输出,action返回null。
PrintWriter out = this.servletResponse.getWriter();
out.write(str);
// 清空缓存
out.flush();
// 关闭流
out.close();
在一个action中有多个方法一起执行。
我使用sumObjAction!showSumObjByPage.action   的方式。
13 楼 equalto 2009-09-27  
你用的是google的jsonPlugin for struts2吧,getXx()会被它当作一个property get方法调用的。
如果你在方法里面设置了断点,就会发现,每次总有个方法被调了两次。


12 楼 piaoyaohou 2009-09-27  
谢谢你的回复
你的意思是不是,一次把需要的数据都取出来,然后在本地new 多个store。
这种方式我也想过,不过这样做有点问题。

问题:
1、在store需要单独提交,我没必要每次都要把全部的数据都取出来。这样就失去ajax的优越性了。
2、一次取出,如果这些store在多个grid中使用(一个页面有多个Grid),我还要传来传去。比较麻烦,不如什么地方使用什么地方后台取数。
3、有些store需要根据条件动态获得(一次取出所有条件的数据放在客户端不现实),本地store不好满足。
11 楼 k0363224 2009-09-27  
先把数据通过AJAX得到,然后用new Ext.data.Store实现本地化数据,就不会出现这个问题,楼主试试
10 楼 qbq 2009-09-25  
我也用到,
但是我是对文件操作
好像有同样问题
9 楼 piaoyaohou 2009-09-25  
我觉得是extjs 并行执行取数据的原因。我现在改成串行的就解决了。

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

不知谁有更好的解决方法?
8 楼 路西法_scu 2009-09-24  
1.jsonStore定义的时候autoLoad设置为true
2.mode="remote"
试试看行不
7 楼 xby123 2009-09-24  
你2个store里的root不一样
6 楼 piaoyaohou 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"}]}


我使用延迟请求的方式,有时也不行。大部分可以。
郁闷!不知道怎么解决了。
5 楼 atian25 2009-09-24  
用firebug看ajax的response即知
4 楼 piaoyaohou 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;
	}





3 楼 atian25 2009-09-23  
mode : 'local', .....
2 楼 piaoyaohou 2009-09-23  
store_comBox_volt.load()  

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

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

不知道什么原因。
1 楼 atian25 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();

相关推荐

    ExtJs Ajax 同步问题

    在使用ExtJS进行开发时,Ajax异步请求是常用的功能之一。然而,有时我们可能会遇到Ajax同步问题,这通常是由于对异步和同步理解不透彻或者配置不当导致的。下面我们将详细探讨这个问题。 在ExtJS中,Ajax请求主要...

    extjs4如何给同一个formpanel不同的url_.docx

    在EXTJS4的API中,通常我们会看到一个`url`属性,这个属性指定了FormPanel在提交表单时将数据发送到的服务器端处理地址。然而,如果希望同一个FormPanel实例能够根据不同的上下文提交到不同的URL,我们需要稍微调整...

    extjs和servlet数据交互的例子

    本文将深入探讨一个使用ExtJS与Servlet进行数据交互的实际例子,这对于初学者理解这两者如何协同工作非常有帮助。 首先,我们来看Servlet的部分。Servlet是Java平台上的一个标准接口,用于扩展服务器的功能,特别是...

    extjs 前后台交互参数出现中文乱码问题的解决方法

    在使用MyEclipse开发工具进行Web应用开发时,尤其是采用ExtJS框架结合Ajax技术进行前后端数据交互的过程中,可能会遇到一个常见的问题:即通过Ajax发送带有中文字符的数据时,后端接收到的数据出现乱码现象。这一...

    Extjs4使用要点个人整理

    ExtJS 是一个强大的JavaScript应用程序框架,专用于构建富客户端Web应用。ExtJS 4是其一个重要的版本,引入了许多新特性、改进和优化。以下是我根据提供的文件名整理的关于ExtJS 4的关键知识点: 1. **控件属性**:...

    extjs3.0 ajax 同步请求

    在上述代码片段中提到了一个关于浏览器兼容性的问题:“在 Firefox 12 中使用时,无法在 IE 和 Chrome 中使用,需要进行一些修改。”这可能是由于不同浏览器对 XMLHttpRequest 对象的支持程度不同所导致的。 解决这...

    ExtJS.in.Action

    ExtJS是一个用于构建复杂Web应用程序的JavaScript库,它提供了丰富的UI组件、强大的数据处理能力以及易于使用的API。本书第一章“A framework apart”中,深入探讨了ExtJS与其他框架的不同之处,如其对DOM操作的高度...

    EXTJS一个小抽奖例子

    EXTJS 是一个基于JavaScript的富客户端应用框架,主要用于构建企业级的Web应用程序。EXTJS 提供了一套完整的组件模型、数据绑定机制、丰富的用户界面控件以及强大的图表功能,使得开发者能够创建出交互性强、用户...

    EXTJS记事本 当CompositeField遇上RowEditor

    对于最后一个Combobox,其数据依赖于前两个Combobox的选择,因此需要在加载数据时使用异步操作。开发者使用了JsonStore的load方法,并在回调函数中设置初始值,确保数据加载完成后进行初始化。 此外,开发者还添加...

    Extjs in action

    **Extjs in Action** 是一本专为希望深入了解Extjs框架的开发人员准备的书籍。它不仅涵盖了Extjs的基础知识,还深入探讨了如何构建可配置的复杂组件。本书由Jesus Garcia撰写,并由Manning Publications出版。 ####...

    ExtJs学习资料28-Ext.data.JsonStore数据存储器.doc

    总结来说,这个例子展示了如何使用ExtJs的JsonStore和GridPanel来显示服务器返回的JSON数据,通过定义列模型、设置表格样式和交互功能,构建了一个简洁的个人信息表格。对于ExtJs开发者而言,理解和掌握JsonStore的...

    extjs My97使用 extjs时间 extjs日期使用

    extjs4.0结合My97DatePicker4.7版本使用 使用简单 方便 解决extjs中日期控件不能显示时间的问题 下载后将其放到extjs目录的examples下 直接运行date.html即可 extjs4.0版本 4.0以前的版本没有测试过 如果有4.0版本...

    extjs向action提交的方法

    extjs向action提交的方法,由Ext界面提交到action的两种方法,点击id为save的按钮时,执行loginFun函数。

    extjs 的权限问题 要求控制的对象是 菜单,按钮,URL

    在Extjs框架中,实现基于角色的权限控制是一个常见需求。Extjs主要用于构建富互联网应用(RIA),其组件化的UI构建方式与传统Web开发有较大差异。因此,对于权限的控制也要采用特定的策略来实现。上述文件内容主要...

    ExtJs in Action 2009完整版

    ExtJs In action 2009,直击Extjs3.0,不可多得的In Action系列学习Extjs的书籍

    extjs3.2api中文

    ExtJS是一个广泛使用的JavaScript库,专门用于构建富客户端应用程序。版本3.2是该库的一个重要里程碑,提供了许多功能和改进。"extjs3.2api中文"标题表明这是一个中文版的ExtJS 3.2 API文档,对于中文开发者来说,...

    EXTJS 折线 chart action 代码示例

    这个示例展示了如何使用EXTJS创建一个与Java后端交互的折线chart,动态加载数据并显示。你可以根据实际需求调整chart的样式和交互效果,如添加工具提示、轴配置、图例等。 通过理解EXTJS的store、proxy、model和...

    Highstock与ExtJs结合使用

    在IT领域,Highstock和ExtJS是两种广泛使用的JavaScript库,它们各自专注于不同的功能,但可以协同工作以创建丰富的、交互式的Web应用程序。本篇文章将深入探讨如何将Highstock与ExtJS结合使用,并通过提供的PHP案例...

    extJs3升级extjs4方案

    例如,在 ExtJS3 中,我们可以使用以下代码来定义一个类: ```javascript Ext.ux.PostStore = Ext.extend(Ext.data.Store, { constructor: function(params) { // ... } }); Ext.reg('PostStore', Ext.ux....

Global site tag (gtag.js) - Google Analytics