JSF f:ajax onevent不读取bean值

时间:2012-04-19 10:49:37

标签: javascript jsf javabeans

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

    <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="#{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都会提醒真实...即使渲染仍然正常工作(即使JavaScript警告{{{{ 1}})。

到底发生了什么事?

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

编辑#1:

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

编辑#2:

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

onevent="#{adminBean.loggedIn} ? yesFunction : noFunction

这可能是一种做法的hackish方式,但它确实有效。

1 个答案:

答案 0 :(得分:2)

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