1

我有一个 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 全部嵌套为 like 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 是会话范围的。当我再次在地址栏中按 Enter 键时,无论我做什么,JavaScript 都会警告 true... 即使渲染仍然正常工作(即使 JavaScript 警告,也不会显示仅应在登录时渲染的内容true)。

到底他妈发生了什么?

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

编辑#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>

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

4

1 回答 1

2

这是因为您的 ajax 请求不会更新脚本。它仍将保持初始值。你可以把脚本放在里面<h:form>。这应该有效。

于 2012-04-19T11:19:04.393 回答