1

a4j:commandButton に問題があります。私が達成しようとしているのはこれです:

送信ボタンとキャンセルボタンのあるフォームがあります。ユーザーが送信ボタンをクリックすると、両方のボタンが無効になり、ユーザーに確認を求めるポップアップが表示されます。ユーザーが確認した後、検証エラーが発生した場合は、送信ボタンとキャンセル ボタンを再度有効にします。私は多くの解決策を試しましたが、どれもうまくいかないようです。以下の解決策よりも優れた解決策がある場合は、投稿してください。私の質問は以下のコードに関するものです

                        <h:panelGrid id="submitPanel" columns="2">
                        <a4j:commandButton id="addRequestButton" render="addRequestButton,cancelButton" onbegin="#{addRequestBean.disableSubmitButton()}" styleClass="LoginButtonStyle" value="Submit" 
                                            disabled="#{addRequestBean.submitEnabled}" oncomplete="#{addRequestBean.enableSubmitButton()}"> 
                            <rich:componentControl target="popup" operation="show" />
                        </a4j:commandButton>
                        <h:commandButton  id="cancelButton" styleClass="LoginButtonStyle" value="Cancel" action="main" disabled="#{addRequestBean.submitEnabled}"> 
                        </h:commandButton>
                    </h:panelGrid>
                    <rich:popupPanel id="popup" modal="true" autosized="true" resizeable="false">
                        <f:facet name="header">
                            <h:outputText value="Verify"></h:outputText>
                        </f:facet>
                        <h:panelGrid id="popupgrid" columns="1">
                            <h:outputText styleClass="labelFontStyle" escape="false" value="All changes are final. &lt;br /&gt;Do you wish to continue?"></h:outputText>
                            <h:outputLabel styleClass="labelFontStyle" value="" for="">  
                            </h:outputLabel>
                        </h:panelGrid>
                        <h:panelGrid columns="2">
                            <h:commandButton  styleClass="LoginButtonStyle" value="Ok"  action="#{addRequestBean.saveRequest}"  onclick="#{rich:component('popup')}.hide()"> 
                            </h:commandButton>
                            <h:commandButton  styleClass="LoginButtonStyle" value="Cancel" onclick="#{rich:component('popup')}.hide()"> 
                            </h:commandButton>
                        </h:panelGrid>
                    </rich:popupPanel>

ViewScoped Bean。

onbegin イベントでバッキング Bean 変数を無効に設定し、oncomplete メソッドで再度有効にします。問題は、フォームの読み込み時に onbegin イベントが発生するため、[送信] ボタンと [キャンセル] ボタンの両方が無効になることです。私が間違っていることがあるに違いありません。そうでない場合、これに対する回避策はありますか? これよりも良い解決策がある場合は、投稿してください。

ありがとう

4

1 に答える 1

0

モーダルポップアップを表示した後に両方のボタンを無効にする必要はないと思いますが(モーダルポップアップとは、定義上、ポップアップが閉じられるかページが更新されるまで、そのページで他のアクションを実行できないことを意味します)、また、送信ボタンをデフォルトで無効にするかどうかは明言されていませんが(とにかくコードが示していることです)、次の方法で実現できる場合があります

  1. 両方のボタンを でラップします<a4j:outputPanel/>。このように、両方のボタンは、とにかくそのページの ajax アクションによって再レンダリングされます。またaction="main"、キャンセルボタンで何をしていますか?それはうまくいきません。また、<h:commandButton/>そこを選択すると、ビュー内の何かを更新するための ajax リクエストが起動されないことを意味します

    <a4j:outputPanel ajaxRendered="true" layout="block">
    <a4j:commandButton id="addRequestButton" styleClass="LoginButtonStyle" action = "#{addRequestBean.toggleSubmitButtonState}"  value="Submit" disabled="#{addRequestBean.submitEnabled}" oncomplete="#{rich:component('popup')}.show()"/> 
    <h:commandButton id="cancelButton" styleClass="LoginButtonStyle" value="Cancel" action="main" disabled="#{addRequestBean.submitEnabled}"/> 
    </a4j:outputPanel>
    
  2. ボタンの状態を切り替えるボタンのメソッド式を追加します

      public void toggleSubmitButtonState(){
        this.submitEnabled = !submitEnabled;     
    
      }
    

    両方のボタンの状態を同じブール値にバインドするべきではありません。意味的には、それらは異なることを行っているためですが、既にここにあるものに固執します

  3. そのポップアップを、現在他のすべてのコンポーネントと共有しているフォームから外すことをお勧めしますが、もう一度、あなたが持っているもので作業しましょう。繰り返しますが、<h:commandButton/>ここで単独を選択すると、Ajax を実行していないことが保証されます。を追加する<f:ajax/>か、これらのボタンを<a4j:commandButton/>

      <h:commandButton  styleClass="LoginButtonStyle" value="Ok"  action="#{addRequestBean.saveRequest}"  oncomplete="#{rich:component('popup')}.hide()"/>
      <h:commandButton  styleClass="LoginButtonStyle" value="Cancel" onclick="#{rich:component('popup')}.hide()"/> <!-- This won't work as is, it will refresh the entire page instead of just firing the javascript event. Change to a4j-->
    
  4. そのページにイベント ハンドラーを追加して<f:event/>、検証の失敗を確認します。

    バッキング Bean に、検証の失敗をチェックするメソッドを追加します。

    public void checkValidationFailures(){
    
    FacesContext context = FacesContext.getCurrentInstance();
    if (context.isPostback() && context.isValidationFailed()){ //if the request is a postback and validation failed
    
       this.submitEnabled = true;             
    
      }
    }
    

    これは、メソッドValidatorException内でa をスローしている場合にのみ機能します。saveRequestそれ以外の場合は、メソッド内で自分で失敗を処理し、submitEnabled値を明示的に設定してからtrueボタンを再レンダリングする必要があります。これが、おそらくポップアップ内のこれらのボタンを に変換する必要がある理由ですa4j

于 2012-11-10T02:38:59.247 に答える