0

不久前,我问了这个问题,这是关于在 csjs 引起的完全刷新后更新属性包。我用一个指向 context.redirectToPage 的 URL 参数解决了这个问题。

现在我有一个带有基于 jquery 的jqGrid 的xPage,它从 viewScope 接收带有 JSON 数据的字符串,并将该数据显示在表中。当我在网格中编辑记录并点击“提交”时,网格会发布一个名为“oper”的参数,其中包含“edit”、“add”等值,为此我检查页面的 beforePageLoad 事件然后执行我的托管 bean 的保存方法。在此之后,我用新的 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);
}}]]>

在服务器控制台中,我可以从第一个打印语句中看到正确、更新的 JSON 字符串,因此保存方法成功,并且我的 viewScope 中有最新数据。但是,网格不显示更新的数据,我的 test-div 也不显示

<xp:text value="#{javascript:viewScope.get('jsonString')}" />

在更新 viewScope 后,我还尝试对网格和 div 进行部分刷新,但同样的情况发生了。手动刷新页面后一切正常。那么,这里发生了什么?我只想将一个简单的字符串传递给控件。我是否又误会了 xPages-Lifecycle 和事件的顺序?

提前致谢。问候,莎拉

4

3 回答 3

0

我认为您正在失去viewScope. redirectToPage尝试使用requestScopeor sessionScope

于 2013-01-30T10:52:45.260 回答
0

感谢所有建议,我尝试了所有建议,但不幸的是没有运气。最有趣的是,当我将客户端警报语句放入 onClientLoad 事件时,它只会在我进入页面时触发一次,但不会在任何 context.redirect 或 .reload 命令之后触发。毕竟我通过以下方式解决了这个问题:

我从 beforePageLoad 事件中删除了重定向命令,并将以下参数添加到 jqGrid 的提交函数中(请参阅此处的文档):

afterSubmit: function(response, postdata) {window.location.href=window.location.href;return [true,'',''];}

这对我有用(在此之后还会再次触发 onClientLoad),但我仍然想知道为什么从服务器端引起的页面刷新与客户端刷新不一样,或者无法模仿客户端刷新。

于 2013-02-07T14:09:31.297 回答
0

我不确定 beforePageLoad 事件是否正确,您是否考虑过在 beforeRenderResponse 中生成 JSON?

于 2013-02-26T15:59:50.280 回答