0

我有一个使用 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 代码

<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() 完成之前检查了已验证的属性。因此,它几乎点击了隐藏按钮并立即询问布尔值,而 myMethod() 甚至还没有完成。

如何使 javascript 以顺序方式运行?

谢谢!

4

1 回答 1

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

于 2013-09-19T16:55:24.173 回答