我有一个 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>
这可能是一种骇人听闻的方式,但它确实有效。