0

为什么 context.redirectToPage 在视图根事件而不是事件处理程序中执行时表现不同?

当我尝试将 xpages 应用程序的语言设置为保存在用户配置文件中的语言时,出现了这个问题,一旦用户登录。我在资源包中使用带有翻译字符串的属性文件,并检索字符串,如这:

<xp:text value="${langString['WELCOME_TEXT']}" />

当更改语言并加载不同的属性文件时,需要刷新页面以更新这些字符串。当我向登录按钮添加一个完全刷新事件处理程序时,这很好用,它执行服务器端 context.redirectToPage()。像 location.reload 或 window.location.href=window.location.href 这样的客户端刷新没有运气(登录功能本身就是客户端功能)。

但是,用户当然希望在他输入凭据后按下回车键而不是按钮时他也已登录。所以我在用户名和密码输入字段中添加了一个onkeypress-event,并在执行登录功能之前检查了输入键(if (thisEvent.keyCode==13) dosomething...)。

但是现在每次按下一个键时都会调用事件处理程序,当然我不希望 context.redirectToPage 一直执行。因此,我删除了服务器端事件处理程序并更改了登录功能,以便它以包含整个页面的 div 的部分刷新而终止:

var p = {"execLogin":"true"}; XSP.partialRefreshPost( '#{id:wholePage}', {params: p} );

通过部分刷新发送的参数现在会触发一个事件,我们的 context.redirectToPage 会在该事件中执行:

<xp:this.beforeRenderResponse><![CDATA[#{javascript:if (param.containsKey('execLogin') && param.get('execLogin').toString().equals('true')) {
    print("test");
    context.redirectToPage(context.getUrl().toSiteRelativeString(context),true);
}}]]></xp:this.beforeRenderResponse>

页面刷新并打印出“测试”,但我仍然看到旧的语言字符串。我必须再次手动刷新页面才能使新的用户语言生效。

知道如何以这种方式执行真正的完全刷新,或者以另一种方式更新从属性包中检索到的字符串吗?

提前致谢。问候,莎拉

编辑

我现在有:

<xp:inputText id="cc_login_panel_login_username" styleClass="span2">
<xp:eventHandler event="onkeypress" submit="true" refreshMode="complete">
    <xp:this.script><![CDATA[if (thisEvent.keyCode!=13) {
        return false;
    } else {
        doLogin();
        return true;                                
    }]]></xp:this.script>
    <xp:this.action><![CDATA[#{javascript:context.redirectToPage(context.getUrl().toSiteRelativeString(context));}]]></xp:this.action>
</xp:eventHandler>

因为 context.reloadPage() 甚至没有让我以某种方式登录(奇怪),所以我重新使用了 redirectToPage。服务器端事件在正确的时间触发一次*竖起大拇指*,但语言属性-行为仍然相同。

4

4 回答 4

1

$ 仅在页面加载时设置,而 # 在每次部分刷新期间设置。

我不认为部分刷新会起作用。这将刷新计算域。但是,需要完全刷新才能刷新包含属性文件的 XPage 部分。换句话说,您将刷新计算域,但使用相同的属性文件。

我想知道 context.redirectToPage 或 context.reloadPage 是否会以某种方式进入同一页面但带有缓存的属性文件。

如果您总是想返回同一页面,则完全刷新而不是部分刷新可能是最佳选择。

于 2013-01-17T20:17:38.960 回答
0

我认为这与使用 $ 参数有关。这告诉运行时在第一次在后端创建当前页面时检索语言文件。当用户进行刷新时,它实际上是在检索您正在查看的页面的已保存版本。

于 2013-01-17T13:37:42.407 回答
0

我看到您在 xp:eventHandler 的 xp:this.action 标记中调用“context.redirectToPage(context.getURL().toSiteRelativeString(context)))”。

尝试使用 xp:this.onComplete 代替 xp:this.action。

根据该操作的设计器工具提示,预期返回是要传递给导航处理程序的字符串。因此,当它完成 eventHandler 事件组时,给 onComplete 将执行重定向命令。

事件处理程序操作工具提示

于 2013-01-18T14:14:49.890 回答
0

感谢所有有用的答案,事实上它们都起作用了,问题原来是我对属性文件何时加载的误解。它是在早期阶段加载的,早在我的新语言设置为 sessionScope 之前(该 sessionScope 变量随后通过 VariableResolver 用作要加载的属性文件名称的一部分)。

现在我使用双完全刷新来加载新文件。当登录函数成功终止时,它执行:

window.location.href = window.location.href + "?doRefresh=true";

在视图根元素中,我添加了以下事件:

<xp:this.beforeRenderResponse><![CDATA[#{javascript:
if (context.getUrlParameter("doRefresh")!=null&&context.getUrlParameter("doRefresh").equals("true")) {
    var url = context.getUrl().toSiteRelativeString(context);
    url = url.replace("?doRefresh=true","");
    context.redirectToPage(url);}
}]]></xp:this.beforeRenderResponse>

这不是一个非常复杂的解决方案,但至少它有效:-)

于 2013-01-19T12:09:01.813 回答