2016-10-06 1 views
3

Voraussetzungen:
- JSF 2.1
- Primefaces 5.2
- Glassfish 3,1Primefaces p: Nachrichten werden nicht zeigen erste Facesmessage

Geschichte:
Ich habe ap erstellt: Dialog verwendet zum Anzeigen von FacesMessages auf dem Element ap: messages. Dieser Dialog wird benötigt, da der Benutzer bestimmte FacesMessages mit einem "OK" -Button festschreiben muss, bevor er fortfährt.

Dialog:

<p:outputPanel id="modalMessage"> 

    <p:dialog id="dlgMessageDialog" dynamic="true" style="z-index: 100" 
     closable="false" widgetVar="wigVarMessageDialog" modal="true" 
     appendTo="@(body)"> 

     <f:facet name="header"> 
      <h:outputText id="messageDialogHeader" 
       value="#{messageDialogBean.header}" /> 
     </f:facet> 

     <p:outputPanel id="modalMessagePanel"> 

      <h:form id="messageForm" enctype="multipart/form-data"> 

       <p:messages id="messages" escape="false" closable="false" 
        showDetail="true" autoUpdate="true" 
        for="#{messageDialogBean.messageDialogId}"></p:messages> 

       <p:spacer height="20px"></p:spacer> 

       <p:commandButton value="#{msg.btnOk}" 
        oncomplete="PF('wigVarMessageDialog').hide()" /> 

      </h:form> 
     </p:outputPanel> 
    </p:dialog> 
</p:outputPanel> 

Bean:

@Named("messageDialogBean") 
@SessionScoped 
public class MessageDialogBean implements Serializable { 

    private static final long serialVersionUID = 1L; 
    private final String messageDialogId = "messageDialogId"; 
    private FacesMessage message = new FacesMessage(); 
    private String header = "test"; 

    public void showMessage(final String pHeader, final FacesMessage pMessage) { 
    if (pMessage != null) { 
     setHeader(pHeader); 
     this.message = pMessage; 
     show(); 
    } 
    } 

    public void showWarn(final String pHeader, final String pSummary, final String pDetail) { 
    setHeader(pHeader); 
    this.message = new FacesMessage(FacesMessage.SEVERITY_WARN, pSummary, pDetail); 
    show(); 
    } 

    public void showInfo(final String pHeader, final String pSummary, final String pDetail) { 
    setHeader(pHeader); 
    this.message = new FacesMessage(FacesMessage.SEVERITY_INFO, pSummary, pDetail); 
    show(); 
    } 

    public void showError(final String pHeader, final String pSummary, final String pDetail) { 
    setHeader(pHeader); 
    this.message = new FacesMessage(FacesMessage.SEVERITY_ERROR, pSummary, pDetail); 
    show(); 
    } 

    public void updateDialog() { 
    RequestContext context = RequestContext.getCurrentInstance(); 
    context.update("mainForm:messageDialogHeader"); 
    } 

    private void show() { 
    updateDialog(); 
    RequestContext context = RequestContext.getCurrentInstance(); 
    context.execute("PF('wigVarMessageDialog').show();"); 
    FacesContext.getCurrentInstance().addMessage(this.messageDialogId, this.message); 
    } 

    public String getMessageDialogId() { 
    return this.messageDialogId; 
    } 

    public void setHeader(final String pHeader) { 
    this.header = pHeader; 
    } 

    public String getHeader() { 
    return this.header; 
    } 

    public FacesMessage getLastMessage() { 
    return this.message; 
    } 

} 

Eine der Nachrichten, die verpflichtet werden müssen:

this.messageDialogBean.showInfo("Title", "Summary", "Detail"); 

Problem:
Das Element p: messages des Dialogfelds zeigt die Meldung nicht an, wenn das Dialogfeld das erste Mal geöffnet wird. Nach dem Öffnen und Verstecken zeigt es alle weiteren FacesMessages an.

Frage:
Bisher i Öffnung am useing und closeing den Dialog einmal, wenn die Schnittstelle als workarround initialisiert wird. Weiß annyon, was dieses Problem an erster Stelle verursacht und wie man es richtig löst?

Danke für Antworten

+0

Haben Sie versucht, den Platz der '' '?!? Ich bin 100% sicher, dass es das Problem ist. –

+1

Sie haben Formular in einem Formular? Ich sehe, dass Sie mainForm aktualisieren: messageDialogHeader – Nikola

+0

Verschachtelte Formulare sind in den aktuellen HTML-Spezifikationen nicht zulässig – thatsIch

Antwort

0

Zunächst einmal ist es nicht erlaubt ist, innerhalb eines anderen eine Form zu bringen, in W3C XHTML-Spezifikation wie angegeben, „Form nicht andere Formularelemente enthalten muss.“ besuchen Sie: https://www.w3.org/TR/xhtml1/#prohibitions.

Also Ihr Dialog nicht innerhalb der Hauptform sein sollte, müssen Sie den Dialog aus dem Formular SPERATE, sould Code wie folgt orginsed werden:

<form id="mainForm" > 
    <!--your main page--> 
</form> 

<p:dialog id="dlgMessageDialog" > 
    <h:form id="messageForm" enctype="multipart/form-data"> 
     <f:facet name="header"> 
      <h:outputText id="messageDialogHeader" 
          value="#{messageDialogBean.header}" /> 
     </f:facet> 

     <p:messages id="messages" escape="false" closable="false" 
        showDetail="true" autoUpdate="true" 
        for="#{messageDialogBean.messageDialogId}"></p:messages> 

     <p:spacer height="20px"></p:spacer> 

     <p:commandButton value="#{msg.btnOk}" 
         oncomplete="PF('wigVarMessageDialog').hide()" /> 

    </h:form> 
</p:dialog> 

Eine andere Sache, können Sie die ganze aktualisieren müssen Wenn der Dialog geöffnet wird, wird die Meldung automatisch aktualisiert:

context.update("dlgMessageDialog"); 
+0

Bereits versucht, das Formular zu entfernen und den gesamten Dialog zu aktualisieren. Es hat nichts geändert. – Basti

+0

versuche, FacesContext.getCurrentInstance() zu erstellen. AddMessage (this.messageDialogId, this.message); dann updateDialog(); –

+0

und über "messageDialogId" wo erscheint es in der html? –

Verwandte Themen