2016-07-25 4 views
0

コマンドボタンをクリックするとパネルが表示されたままになり、実行されたメソッドがエラーメッセージを表示します。リッチ:popupPanelがコマンドボタンをクリックした後に閉じるのを防ぐ

具体的には、日付を取得する入力フィールドのバリデータがあります。この日付が有効でない場合、バッキングBeanのvalidateメソッドがエラーメッセージを作成します。これは、コマンドボタンを使用した後、ポップアップパネルの入力フィールドの横に表示されます。

コマンドボタンをクリックするとポップアップが閉じます。しかし、私がそれを再度開くと、エラーメッセージが表示され、なぜ私はそれが最初の場所で閉じられたのか不思議に思って、maximumSeverity条件が満たされていないと思います。

マイXHTMLページ:バッキングBeanで

<h:body> 
    <h:commandButton id="note" value="Neuer Satz"> 
     <rich:componentControl target="note_panel" operation="show" /> 
    </h:commandButton> 

    <rich:popupPanel id="note_panel" modal="true" autosized="true" 
     resizeable="false" header="Neuen Mehrwertsteuersatz vormerken" 
     domElementAttachment="form"> 
       Gültig ab 
       <h:inputText id="newVorGueltigAb" 
      value="#{mehrwertsteuerBean.neuGueltigAb}" maxlength="10" 
      validator="#{mehrwertsteuerBean.validateNewDate}" /> 
     <h:message for="newVorGueltigAb" style="color:red" /> 
     <h:commandButton value="Vormerken" 
      action="#{mehrwertsteuerBean.addSteuersatz()}" 
      oncomplete="if (#{facesContext.maximumSeverity==null}) 
        #{rich:component('note_panel')}.hide(); return false;" /> 
     <h:commandButton value="Abbrechen" 
      onclick="#{rich:component('note_panel')}.hide(); return false;" /> 
    </rich:popupPanel> 
</h:body> 

私の検証方法:すべての

public void validateNewDate(FacesContext context, UIComponent toValidate, 
      Object value) { 
     String regex = "([0-9]{2}).([0-9]{2}).([0-9]{4})"; 
     String date = (String) value; 
     if (date.matches(regex)) { 
      validNewDate = true; 
     } else { 
      validNewDate = false; 
      String message = "Bitte gültiges Datum eingeben!"; 
      context.addMessage(toValidate.getClientId(context), 
        new FacesMessage(message)); 

     } 
} 
+0

h:commandButtonには 'oncomplete'属性がありません。 – Makhiel

+0

ああ、ありがとう! しかし、a4j:commandButtonを使用すると、別の問題が発生します。 間違った日付を送信しようとすると、ポップアップが希望どおりに閉じることはできませんが、エラーメッセージは表示されません。 – Marco

+0

メッセージがある場所をレンダリングする必要があります。 BTW。 newVorGueltigAbの検証に失敗した場合にのみ表示されます。だからフォーム全体で 'h:messages'や' rich:messages'をチェックしてください。 BTW2。検証を失敗させるには、 'ValidatorException'をスローする必要があります。 –

答えて

0

まず、あなたは検証が失敗したいときに例外をスローする必要があります。だから、このようなものに見える必要があります。

public void validateNewDate(FacesContext context, UIComponent toValidate, Object value) { 
    String regex = "([0-9]{2}).([0-9]{2}).([0-9]{4})"; 
    String date = (String) value; 
    if (!date.matches(regex)) { 
     String message = "Bitte gültiges Datum eingeben!"; 
     throw new ValidatorException(
      new FacesMessage(FacesMessage.SEVERITY_ERROR, message, null)); 
    } 
} 

そんなにモデルに変化し、あなたのcommandButtonが発射されないものとしますでのアクションは存在しませんならば。これはJSF検証の正しい流れです。

第2のこと。手動で検証エラーを処理する必要があります。

public boolean isNoErrorsOccured() { 
    FacesContext facesContext = FacesContext.getCurrentInstance(); 
    return ((facesContext.getMaximumSeverity() == null) || 
       (facesContext.getMaximumSeverity() 
        .compareTo(FacesMessage.SEVERITY_INFO) <= 0)); 
} 

そして、これはあなたのa4j:commandButton

は次のようになります:私はこれを使用しているいくつかの誤りがあったかどうかを確認するには

<a4j:commandButton value="Vormerken" execute="note_panel" 
    action="#{mehrwertsteuerBean.addSteuersatz}" 
    render="note_panel" 
    oncomplete="if (#{facesHelper.noErrorsOccured}) {#{rich:component('note_panel')}.hide();} 
       else { console.log('OMG! I\'ve got an error!'); }" /> 

更新:

すべてがすべき次のようになります。

<rich:popupPanel id="note_panel" modal="true" autosized="true" resizeable="false" 
    header="Neuen Mehrwertsteuersatz vormerken" domElementAttachment="body"> 
    Gültig ab 
    <h:form> 
     <h:inputText id="newVorGueltigAb" value="#{mehrwertsteuerBean.neuGueltigAb}" maxlength="10" 
      validator="#{mehrwertsteuerBean.validateNewDate}" /> 
     <h:message for="newVorGueltigAb" style="color:red" /> 
     <a4j:commandButton value="Vormerken" execute="@form" action="#{mehrwertsteuerBean.addSteuersatz}" 
      render="@form" 
      oncomplete="if (#{mehrwertsteuerBean.noErrorsOccured}) {#{rich:component('note_panel')}.hide();}" /> 
     <h:commandButton value="Abbrechen" 
      onclick="#{rich:component('note_panel')}.hide(); return false;" /> 
    </h:form> 
</rich:popupPanel> 

注:

  • <h:form>がありません!
  • render属性です。これは、検証エラーが発生した場合にパネルをレンダリングする必要があるためです。
  • actionの末尾に角括弧はありません。
  • execute属性はポップアップのみに設定されています。これにより、フォーム全体の他のフィールドは更新されません。
  • h:formがポップアップの内側にあるので、domElementAttachmentを本文に変更しました。
+0

答えてくれてありがとう、Emil、それでもあなたのコードでは動作しません。最初はコピーしてページに貼り付けましたが、正しい日付を入力してもpopupPanelが終了しませんでした。さらに、エラーは表示されませんでした。他のボタン「Abbrechen」でパネルを閉じてもう一度開くと、メッセージが表示されます。 次に、いくつかの属性を削除して問題を解決しようとしました。日付が有効であっても、パネルを閉じるのを防ぎ、レンダリング属性を一緒に実行すると思われます。 メッセージがすぐにレンダリングされない理由はわかりません。 – Marco

+0

さらに、「Vormerken」ボタンをクリックすると、コンソールに次のエラーが表示されることがわかりました: TypeError:RichFaces。$(...)は未定義です – Marco

+0

私は通常あなたのように見えますJSFを最初に学ばなければなりませんが、私は自分の答えを更新しました。私はすぐに働きます。コピーして貼り付けてください。 –