【发布时间】:2013-01-19 20:09:01
【问题描述】:
为什么 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>
页面刷新并打印出“test”,但我仍然看到旧的语言字符串。我必须再次手动刷新页面才能使新的用户语言生效。
知道如何以这种方式执行真正的完全刷新,或者以其他方式更新从属性包中检索到的字符串吗?
提前致谢。问候, 莎拉
编辑
我现在有:
<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。服务器端事件在正确的时间触发一次*竖起大拇指*,但语言属性 - 行为仍然相同。
【问题讨论】:
-
如何更改应用程序中的语言/区域设置?您是否有任何理由在重定向中使用 true 参数?为什么不使用 context.reloadPage?
-
我刚刚添加了 true 参数,看看它是否改变了任何东西(没有)。我尝试使用 context.reloadPage 而不是 redirectToPage,但它产生了相同的行为。实际上,我只是在加载另一个属性文件以在用户登录时更改语言:
<xp:bundle var="langString" src="/#{getUserLanguage}.lang.properties" />当我将 #{getUserLanguage} 放入 xp:inputText 或其他内容时,我可以看到它已更改为正确的语言,但 xpage 不会从新文件加载新字符串 - 仅在执行手动完全刷新时。 -
我还在努力理解“keyCode”这个东西……为什么你的代码每次都被执行?您可以通过在客户端事件中返回 false 来停止执行服务器端事件。
-
我不明白为什么这不起作用。在您编写时,按钮按预期工作,但按键触发的事件却没有。这个对吗?如果不是,请回答我的第一个问题:如何更改语言环境设置?这是时间问题吗?如果您在不同的阶段/事件(beforeRenderResponse 等)中打印出区域设置会怎样。附:如果您只是将 refershId 属性(又名目标)留空,则可以对整个页面进行部分刷新。
标签: xpages xpages-ssjs