XPages:在客户端函数之后执行context.redirectToPage?

时间:2013-01-17 12:49:32

标签: xpages xpages-ssjs

为什么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>

页面刷新,&#34;测试&#34;打印出来,但我仍然看到旧的语言字符串。我必须再次手动刷新页面以使新用户语言生效。

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

提前致谢。问候, 萨拉

修改

我现在有:

<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。服务器端事件在正确的时间* *竖起*被触发一次,但语言属性-bevaviour仍然是相同的。

4 个答案:

答案 0 :(得分:1)

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

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

我想知道context.redirectToPage或context.reloadPage是否以某种方式转到同一页面但是使用了缓存的属性文件。

如果您一直希望回到同一页面,则可以选择完全刷新而不是部分刷新。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我看到你在xp:eventHandler的xp:this.action标签内调用了“context.redirectToPage(context.getURL()。toSiteRelativeString(context)))”。

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

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

Event Handler Action Tooltip

答案 3 :(得分: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>

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