2016-10-06 4 views
3

Предпосылки:
- JSF 2.1
- Primefaces 5,2
- Glassfish 3.1Primefaces р: сообщения не будут показывать первый FacesMessage

история:
Я создал ар: диалог используется для отображения FacesMessages в элементе ap: messages. Этот диалог необходим, потому что перед тем, как продолжить, пользователь должен зафиксировать определенные FacesMessages с помощью кнопки «ОК».

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

} 

Одно из сообщений, которые должны быть поручены:

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

Задача:
Элемент p: messages в диалоговом окне не отображает сообщение, когда диалог открывается в первый раз. После открытия и скрытия, как только он показывает все дальнейшие FacesMessages просто отлично.

Вопрос:
До сих пор я использованияКонтактная открытие и один раз closeing диалог, когда интерфейс инициализируется как workarround. Разве annyone знает, что вызывает эту проблему в первую очередь, а также как ее правильно решить?

Спасибо за ответы

+0

пытались ли вы изменить место '' ?!? я на 100% уверен, что это проблема. –

+1

У вас есть форма внутри формы? Я вижу, что вы обновляете mainForm: messageDialogHeader – Nikola

+0

Вложенные формы не допускаются в текущих спецификациях HTML – thatsIch

ответ

0

Прежде всего, это не разрешается ставить форму внутри другого, как указано в спецификации W3C XHTML, «форма не должна содержать другие элементы формы.» посещение: https://www.w3.org/TR/xhtml1/#prohibitions.

Так ваш диалог не должен быть внутри основной формы, вы должны Sperate диалог из формы, код sould быть orginsed так:

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

Другое дело, вы должны обновить весь диалог, поэтому при открытии диалога с messges будет автоматически обновлена:

context.update("dlgMessageDialog"); 
+0

Уже пробовал удалить форму и обновить весь диалог. Это ничего не изменило. – Basti

+0

попробуйте сделать FacesContext.getCurrentInstance(). AddMessage (this.messageDialogId, this.message); затем updateDialog(); –

+0

и о "messageDialogId", где он отображается в html? –