2016-07-25 24 views
0

Ich möchte, dass meine Anzeige sichtbar bleibt, wenn ich auf eine Befehlsschaltfläche klicke und die ausgeführte Methode eine Fehlermeldung aufruft.Verhindern, dass sich ein Rich: PopupPanel nach dem Klicken auf eine Befehlsschaltfläche schließt

Um genauer zu sein habe ich einen Validator für ein Eingabefeld, das ein Datum bekommen sollte. Wenn dieses Datum nicht gültig ist, erstellt meine Validierungsmethode im Backing Bean eine Fehlermeldung. Dies sollte nach dem Verwenden der Befehlsschaltfläche neben dem Eingabefeld im Popup-Fenster angezeigt werden.

Durch Klicken auf die Befehlsschaltfläche wird das Popup jedoch geschlossen. Aber wenn ich es wieder öffne, wird die Fehlermeldung angezeigt, was mich wundern lässt, warum es überhaupt geschlossen wurde, als die maximumSeverity-Bedingung nicht erfüllt wurde.

Meine xhtml Seite:

<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> 

Meine Validierungsmethode in dem Backing Bean:

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 hat kein 'oncomplete' Attribut. – Makhiel

+0

Oh, nun, danke! Aber wenn ich a4j: commandButton verwende, kommt ein anderes Problem auf: Wenn ich versuche, ein falsches Datum zu senden, wird das Popup nicht wie gewünscht schließen, aber keine Fehlermeldung wird angezeigt. – Marco

+0

Sie müssen den Ort, an dem die Nachricht ist, rendern. Übrigens. Es wird nur etwas angezeigt, wenn die Validierung für newVorGueltigAb fehlschlägt.Schauen Sie sich also 'h: messages' oder' rich: messages' für das gesamte Formular an. BTW2. Sie müssen 'ValidatorException' auslösen, wenn die Validierung fehlschlagen soll. –

Antwort

0

Zunächst einmal, wenn Sie möchten, die Validierung fehlschlagen Sie eine Ausnahme werfen. So muss es sieht ungefähr so ​​aus:

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)); 
    } 
} 

Wenn Sie so wird es keine Änderungen in Modell und die Aktion in Ihrem die commandButton NICHT abgefeuert werden. Dies ist der richtige Ablauf für die JSF-Validierung.

Zweite Sache. Sie müssen Validierungsfehler manuell behandeln. Um zu überprüfen, ob es ein Fehler war ich dies mit:

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

Und mit diesem Ihre a4j:commandButton wie folgt aussehen:

<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!'); }" /> 

Update:

Alle sollten wie folgt aussehen:

<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> 
Hinweis

:

  • <h:form> fehlt !!!
  • Das render Attribut, weil Sie Ihr Panel im Falle eines Validierungsfehlers rendern müssen.
  • Es gibt keine Klammern am Ende von action.
  • Das Attribut execute wird nur auf Popup gesetzt. Dies führt dazu, dass keine anderen Felder des gesamten Formulars aktualisiert werden.
  • Seit h:form ist innerhalb des Popup Ich habe domElementAttachment zu Körper geändert.
+0

Vielen Dank für Ihre Antwort Emil, aber es funktioniert immer noch nicht mit Ihrem Code. Zuerst kopiere ich es einfach auf meine Seite, was dazu führt, dass das PopupPanel nicht schließt, auch wenn ich ein korrektes Datum eingegeben habe. Außerdem wurde der Fehler nicht angezeigt. Wenn ich das Panel mit der anderen Schaltfläche "Abbrechen" schließe und es wieder öffne, wird die Nachricht angezeigt. Dann habe ich einige Attribute entfernt und versucht, das Problem zu lösen, und es scheint, dass die Attribute execute und render zusammen verhindern, dass das Panel schließt, selbst wenn das Datum gültig ist. Warum die Nachricht nicht sofort gerendert wird, kann ich nicht sagen. – Marco

+0

Außerdem habe ich herausgefunden, dass beim Anklicken des "Vormerken" -Buttons die folgende Fehlermeldung angezeigt wird: TypeError: RichFaces. $ (...) ist undefined – Marco

+0

Normalerweise mache ich das nicht, weil es so aussieht wie du muss zuerst JSF lernen, aber ich habe meine Antwort aktualisiert. Ich arbeite außerhalb der Box. Kopieren Sie es einfach. –