为什么 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。服务器端事件在正确的时间触发一次*竖起大拇指*,但语言属性-行为仍然相同。