不久前,我问过this question,这是关于在csjs引发的完全刷新后更新属性包的问题。我用一个导致context.redirectToPage的URL参数解决了它。
现在我有一个带有基于jquery的jqGrid的xPage,它从viewScope接收带有JSON数据的字符串,并在表中显示该数据。当我在网格中编辑记录并点击“提交”时,网格会发布一个名为“oper”的参数,其值为“edit”,“add”等,我会检查页面的beforePageLoad事件然后执行我托管bean的save方法。在此之后,我使用新的JSON字符串更新viewScope变量,并以上述方式进行完全刷新。之前已经有效。
<xp:this.beforePageLoad><![CDATA[#{javascript:
if (bccUser.isAdmin() && param.containsKey('oper') && param.get('oper').toString().length>0) {
bccGridDataHandler.saveGridDoc('RequestDummy','PersonRequestsDummy',param);
}
viewScope.put('jsonString',bccView.getViewColumnValue('PersonRequestsDummyJson',1));
print('jsonString in viewScope: '+viewScope.get('jsonString'));
if (bccUser.isAdmin() && param.containsKey('oper') && param.get('oper').toString().length>0) {
var url = context.getUrl().toSiteRelativeString(context);
if (url.indexOf('?')!=-1) {
url += "&doRefresh=true";
} else {
url += "?doRefresh=true";
}
print("redirecting to: "+url);
context.redirectToPage(url);
}}]]>
在服务器控制台中,我可以从第一个print语句中看到正确的,更新的JSON字符串,因此save-method成功,我的viewScope中有最新的数据。但是,网格不会显示更新的数据,我的test-div也不会显示
<xp:text value="#{javascript:viewScope.get('jsonString')}" />
我在更新viewScope后尝试对网格和div进行局部刷新,但同样的情况也发生了。手动刷新页面后,一切都很好。那么,这里发生了什么?我只想将一个简单的字符串传递给控件。我是否再次误认为xPages-Lifecycle和事件的顺序?
提前致谢。此致,莎拉
答案 0 :(得分:0)
我认为您正在失去viewScope
中的redirectToPage
值。尝试使用requestScope
或sessionScope
。
答案 1 :(得分:0)
感谢所有建议,我全力以赴,但遗憾的是没有运气。最有趣的是,当我将一个客户端警报语句放入onClientLoad事件时,当我进入页面时,它只会触发一次,而不是在任何context.redirect或.reload命令之后触发。 毕竟我通过以下方式解决了问题:
我从beforePageLoad事件中删除了redirect命令,并将以下参数添加到jqGrid(see documentation here)的submit函数中:
afterSubmit: function(response, postdata) {window.location.href=window.location.href;return [true,'',''];}
这适用于我(onClientLoad也会在此之后再次触发),但我仍然想知道为什么从服务器端引起的页面刷新与客户端刷新不同,或者无法模仿clienside刷新。
答案 2 :(得分:0)
我不确定beforePageLoad事件是否正确,您是否考虑过在beforeRenderResponse中生成JSON?