【问题标题】:XPages: execute context.redirectToPage after client side function?XPages:在客户端功能之后执行 context.redirectToPage?
【发布时间】: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,但它产生了相同的行为。实际上,我只是在加载另一个属性文件以在用户登录时更改语言:&lt;xp:bundle var="langString" src="/#{getUserLanguage}.lang.properties" /&gt; 当我将 #{getUserLanguage} 放入 xp:inputText 或其他内容时,我可以看到它已更改为正确的语言,但 xpage 不会从新文件加载新字符串 - 仅在执行手动完全刷新时。
  • 我还在努力理解“keyCode”这个东西……为什么你的代码每次都被执行?您可以通过在客户端事件中返回 false 来停止执行服务器端事件。
  • 我不明白为什么这不起作用。在您编写时,按钮按预期工作,但按键触发的事件却没有。这个对吗?如果不是,请回答我的第一个问题:如何更改语言环境设置?这是时间问题吗?如果您在不同的阶段/事件(beforeRenderResponse 等)中打印出区域设置会怎样。附:如果您只是将 refershId 属性(又名目标)留空,则可以对整个页面进行部分刷新。

标签: xpages xpages-ssjs


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我刚刚尝试使用 # 检索语言字符串,但没有帮助。执行 context.redirectToPage 时字符串仍未更新,仅当我手动刷新页面时才会发生这种情况。当用户登录时,没有办法强制服务器重新呈现页面吗?这就是我认为 context.redirectToPage 正在做的事情。
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      感谢所有有用的答案,事实上它们都起作用了,问题原来是我对 when 加载属性文件的误解。它是在早期阶段加载的,早在我的新语言设置为 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>
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-15
        • 1970-01-01
        • 1970-01-01
        • 2018-10-30
        • 2010-12-20
        • 1970-01-01
        • 2014-10-12
        相关资源
        最近更新 更多