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>

問題は、myMethod() が完了する前に、javascript が検証済みの属性をチェックしているように見えることです。そのため、非表示のボタンをクリックするとすぐにブール値の値が要求されますが、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 に答える