【问题标题】:JSF f:ajax onevent not reading bean valueJSF f:ajax onevent 未读取 bean 值
【发布时间】:2012-04-19 10:49:36
【问题描述】:

我有一个 AdminBean,它有一个 loggedIn 布尔值,它是在来自 onclick 的查询之后设置的:

    <h:commandButton rendered="#{!adminBean.loggedIn}" styleClass="moreButtonAsText" id="adminLoginAsText" value="Login" action="#{adminBean.logIn}">
      <f:ajax render="detailsBox adminForm" execute="@form" onevent="onevent"/>
    </h:commandButton>

  </h:form>
</div>

<script type="text/javascript">
  function onevent(e){
    if(e.status=='success') {
      alert(#{adminBean.loggedIn});
    } 
    if(e.status=='complete') {
      alert(#{adminBean.loggedIn});
    } 
  }
</script>

我需要这个,因为我想根据用户是否成功登录来做不同的 javascript 事情。首先单击命令按钮(显然),然后将登录设置为 true。我在我的 AdminBean 类中有这个明确的:

public boolean isLoggedIn() {
    System.out.println(loggedIn);
    return loggedIn;
}

最初我将 onevent 全部嵌套为onevent="#{adminBean.loggedIn} ? yesFunction : noFunction,但这不起作用。所以我四处阅读并发现 http://fyhao.com/2010/05/computer-and-it/java/java-server-faces/jsf-2-fajax-why-execute-onevent-three-times/ 所以我决定把它拆分成一个内联函数,但是还是不行。
然后我决定继续我上面发布的内容,除了关于 JavaScript 认为值是什么的明确警告声明(以及我的打印行,看看他们是否同意......)

Java 控制台,通过第一个警报(e.status=='complete'),首先打印出很多错误,然后打印出很多正确。
JavaScript 警告错误。

然后我清除控制台并在警报上单击确定。然后控制台打印 nothing,并调用第二个警报,仍然是错误的。所以我的 JavaScript 失败了。

现在我注意到另一件奇怪的事情...... AdminBean 是会话范围的。当我再次在地址栏中按回车键时,无论我做什么,JavaScript 都会警告 true... 即使渲染仍然正常工作(未显示仅在登录时才渲染的内容,即使 JavaScript 警告 @987654326 @)。

这到底是怎么回事?

如果您需要更多信息/代码,请询问。

编辑#1:

当我上面说我试过onevent="#{adminBean.loggedIn} ? yesFunction : noFunction时, 我也试过onevent="#{adminBean.loggedIn} ? yesFunction : noFunction。我意识到我可能在这些函数上缺少引号/撇号,但在我解决该问题之前,我想修复 adminBean.loggedIn 问题。

编辑#2:

查看所选答案;我正在研究这个解决方案,然后答案基本上证实了我的结果。

<h:form id="javascriptHack">
  <h:form id="hiddenJS" rendered="#{adminBean.loggedIn}" >
    <script type="text/javascript">
      $(function() {
        (#{adminBean.loggedIn}) ? slowCloseAdminPanel() : adminPanelLeftOpen();
      });
    </script>
  </h:form>
</h:form>

这可能是一种骇人听闻的方式,但它确实有效。

【问题讨论】:

    标签: javascript jsf javabeans


    【解决方案1】:

    这是因为您的 ajax 请求没有更新脚本。它仍将保持初始值。您可以将脚本放在&lt;h:form&gt; 中。这应该可以。

    【讨论】:

    • 最初我有 `onevent="#{adminBean.loggedIn} ? first : second",它位于 f:ajax 中,它正在重新呈现它所在的表单。我不知道为什么那行不通。但是...我正在工作,现在已经完成了基本上完全符合您建议的测试(在我看到您的评论之前)。我将编辑我的代码以发布解决方案。但是,为什么第一种方法不起作用?
    猜你喜欢
    • 2012-03-06
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 2013-01-17
    相关资源
    最近更新 更多