我有一个使用JSF 2.0,javascript和查询1.9的应用程序。我有一种情况,我需要根据bean的方法的结果有条件地渲染组件。现在的逻辑是,当单击按钮时,javascript会以某种.css样式显示具有成功消息的组件。我需要的是,当点击相同的按钮时,javascript调用bean的方法,并根据该方法的结果显示相同的成功组件或另一个组件,解释失败的原因。我知道javascript和jquery都不能直接调用bean的方法,所以相反,javascript会点击一个调用bean方法的隐藏按钮。所以,一般来说,这就是我想做的事情。
豆类代码
public boolean getValidated(){
return validated;
}
public void setValidated(boolean value){
validated = value;
}
public void myMethod(){
....
if(condition){
validated = true;
}else{
validated = false;
}
}
JSF CODE
<h:commandButton onclick="magic()/>
<h:commandButton id="hiddenButton" action="#{bean.myMethod}" style="display:none;"/>
<script type="text/javascript">
// <![CDATA[
function magic(){
document.getElementById('hiddenButton').click();
if(#{bean.validated}){
NI.pnx.messaging.popMessage(NI.pnx.messaging.messageTypes.success,['<strong>The requested updates have been saved.</strong> <a href="" class="right"><strong>Undo Change</strong></a>'],NI.pnx.messaging.messageTimeoutSpeeds.slow);
}else{
NI.pnx.messaging.popMessage(NI.pnx.messaging.messageTypes.error,['<strong>The requested updates have not been saved.</strong> <a href="" class="right"><strong>Undo Change</strong></a>'],NI.pnx.messaging.messageTimeoutSpeeds.slow);
}
}
// ]]>
</script>
问题是javascript似乎在myMethod()完成之前检查了validated属性。因此,它几乎点击隐藏按钮并立即询问布尔值,而myMethod()甚至还没有完成。
如何让javascript以顺序方式运行?
谢谢!
答案 0 :(得分:1)
让命令按钮有条件地使脚本内联。
<h:commandButton value="magic" action="#{bean.myMethod}">
<f:ajax render="script">
</h:commandButton>
<h:panelGroup id="script">
<h:outputScript rendered="#{facesContext.postback}">
<![CDATA[
if (#{bean.validated}) {
NI.pnx.messaging.popMessage(NI.pnx.messaging.messageTypes.success,['<strong>The requested updates have been saved.</strong> <a href="" class="right"><strong>Undo Change</strong></a>'],NI.pnx.messaging.messageTimeoutSpeeds.slow);
} else {
NI.pnx.messaging.popMessage(NI.pnx.messaging.messageTypes.error,['<strong>The requested updates have not been saved.</strong> <a href="" class="right"><strong>Undo Change</strong></a>'],NI.pnx.messaging.messageTimeoutSpeeds.slow);
}
]]>
</h:outputScript>
</h:panelGroup>
如果你使用的是真正的JSF验证器,那么你也可以使用#{facesContext.validationFailed}
而不是在bean中手动跟踪它。
无关,您可能会发现PrimeFaces <p:growl>
比轮子的重新发明更有帮助。