顺序javascript执行

时间:2013-09-19 16:42:45

标签: javascript jsf jsf-2

我有一个使用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以顺序方式运行?

谢谢!

1 个答案:

答案 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>比轮子的重新发明更有帮助。