项目中,系统查询数据列表页面,对查询结果数据操作后(如删除),页面跳转到查询前的状态,而应该停留在当前页面,保留显示当前设置的查询条件。。
之前,大家都是重新调用后台查询方法(如list.do),刷新页面,导致之前查询结果数据失效。。
解决思路同jmesa查询方法,由于jmesa会在list.do后面加上他自己的查询字符串。那我直接调用jmesa的js查询代码就OK
好了,这个简单,在删除成功时,需要刷新数据的JS方法里添加jmesa自己的查询方法,onInvokeAction(id)。。。
对于不考虑分页的情况,以上方法可行,但同时要保留分页状态,怎么办呢,也就是我在查询结果中,选择table第2页,删除里面某条数据,删除后,table仍然显示查询结果第2页,而不需要用户重新查询,并翻到第二页。。。
用firebug看了下发送到后台的url,发现url参数中,有分页信息,expert_p_=1。expert指的是tableid,这个自定,1就是当前页码。。。
分析了下jmesa,当查看下一页时,会先调用jQuery.jmesa.setPageToLimit(id,currentpage);方法,好了,只要我得到当前页面页码,问题就解决了。。。怎么获得当前页码呢,还是用furefug查看后台jmesa返回的table,发现页码貌似后台计算好,固定死了,页面无法通过dom查询到。。分析了下jmesa,js的源码,在jquery.jmesa.js中,发现存在classes对象,这个对象有分页,查询条件等属性,既limit,当前页面,就是limit.page。。。仔细看了下jquery.jmesa.js,没有发现哪有提供分页信息的对外接口。。。 晕,算了,自己在jquery.jmesa.js中添加
getLimitPage : function(id) { var limit = this.getTableFacade(id).limit; return limit.page; }
接下来就是核心方法了,由于grooy和jsp标签对应的jmesa查询方法不一样,写了2个
function deleteWithLimitInfoForJSP(id){ var currentpage=jQuery.jmesa.getLimitPage(id); jQuery.jmesa.setPageToLimit(id,currentpage); createHiddenInputFieldsForLimitAndSubmit(id); } function deleteWithLimitInfoForGroovy(id){ var currentpage=jQuery.jmesa.getLimitPage(id); jQuery.jmesa.setPageToLimit(id,currentpage); onInvokeAction(id); }
具体使用方法根据项目中的情况写的
一。使用Groovy,以需求申请为例:
将原有删除方法中的代码:
else if(msg.hasDetail =='true') { $.post('${pageContext.request.contextPath}/roreq/listByRoreq.do?status='+Ext.get("statusBak").dom.value, function(data) { $("#RoReqs").html(data); Ext.Msg.show({ title : 'OK', msg : '删除成功!', buttons : Ext.Msg.OK }); }); }
改成:
else if(msg.hasDetail =='true') { Ext.Msg.show({ title : '成功', msg : '删除成功', buttons : Ext.Msg.OK, icon : Ext.Msg.INFO }); deleteWithLimitInfoForGroovy('roreq'); }
核心方法是deleteWithLimitInfoForGroovy(id);需要将ID改为当前jmesa table的id,如'roreq'。。
注意,由于此方法会调用之前页面添加的查询方法onInvokeAction(id)
当且仅当查询代码是以下形似才能用deleteWithLimitInfoForGroovy(id)方法
<script type="text/javascript"> function loadRoReqPropertys(parameterString) { $.post('${pageContext.request.contextPath}/roreq/listByRoreq.do?status='+Ext.get("statusBak").dom.value + "&" + parameterString, function(data) { $("#RoReqs").html(data); }); } function onInvokeAction(id) { setExportToLimit(id, ''); var parameterString = createParameterStringForLimit(id); if (id == 'roreq') { loadRoReqPropertys(parameterString); } } </script>
二。使用JSP标签,以供应商为例
将else里的代码改为
Ext.Msg.show({ title : '成功', msg : '删除成功', buttons : Ext.Msg.OK, icon : Ext.Msg.INFO }); deleteWithLimitInfoForJSP('providers');
核心方法是deleteWithLimitInfoForJSP(id);需要将ID改为当前jmesa table的id,如'providers'。
注意,由于此方法会调用之前页面添加的查询方法createHiddenInputFieldsForLimitAndSubmit(id)
当且仅当查询代码是以下形似才能用deleteWithLimitInfoForJSP(id)方法
<script type="text/javascript"> function onInvokeAction(id) { createHiddenInputFieldsForLimitAndSubmit(id); } </script>