2016-06-14 5 views
0

У меня есть диалог с двумя полями ввода и командой Command, чтобы добавить объект. Если пользователь покидает пустое поле, отображается сообщение рычание, и диалог остается открытым. Но если пользователь заполняет все поля и нажимает кнопку commandButton, объект добавляется, но диалог не закрывается.Диалоговое окно Primefaces не закрывается, когда действие завершено.

View.xhtml

<h:form id="allIncidenciasAux"> 
    <div id="divBotonCrear"> 
     <p:commandButton value="Añadir Incidencia" type="button" onclick="PF('dlg1').show();"/> 
    </div> <br/> 

    <p:tabView> 
     <p:tab title="All"> 
      <ui:repeat value="#{incidenciaBean.allIncidencias}" var="aux" > 
       <p:panel id="basic" header="#{aux.titulo}" style="margin-bottom:20px" toggleable="true" collapsed="true" styleClass="#{ aux.solucionado eq 'false' ? 'incNS' : null}"> 
        <h:panelGrid columns="2"> 
         <h:panelGrid style="background-color: #B6C2DE; padding: 10px;"> 
          <h:panelGrid columns="2"> 
           <h:outputText value="Fecha de publicacion: " style="font-weight: bold"/> 
           <h:outputText value="#{aux.fecha_publicacion}"/> 
          </h:panelGrid> 
          <h:panelGrid columns="2"> 
           <h:outputText value="Autor: " style="font-weight: bold"/> 
           <h:outputText value="#{aux.nombreCompleto}"/> 
          </h:panelGrid> 
          <h:panelGrid columns="2"> 
           <h:outputText value="Solucionado: " style="font-weight: bold"/> 
           <h:outputText value="#{aux.solucionado ? 'Si' : 'No'}"/> 
          </h:panelGrid> 
         </h:panelGrid> 

         <h:panelGrid> 
          <h:outputText value="Descripción: " style="font-weight: bold"/> 
          <h:outputText value="#{aux.descripcion}"/> 
         </h:panelGrid> 
        </h:panelGrid> <br/> 
       </p:panel> 
      </ui:repeat> 
     </p:tab> 
    </p:tabView> 
    <p:growl id="growl" showDetail="true" sticky="false" life="8000"/> 
</h:form> 

<h:form id="dialogAddIncidencia"> 
    <p:dialog id="newIncDialogo" header="Nueva Incidencia" widgetVar="dlg1" minHeight="40" resizable="false"> 
     <p:ajax event="close" listener="#{incidenciaBean.handleClose}" update=":dialogAddIncidencia"/> 
     <p:outputLabel value="Título"/> <br/> 
     <p:inputTextarea id="tituloEdit" value="#{incidenciaBean.titulo}" rows="2" cols="50" counter="displayTA" maxlength="50" counterTemplate="{0} caracteres restantes" autoResize="true" required="true" requiredMessage="Título necesario"/> <br/> 
     <p:outputLabel id="displayTA"/> <br/> <br/> 

     <p:outputLabel value="Descripción: "/> <br/> 
     <p:inputTextarea id="descripcion" value="#{incidenciaBean.descripcion}" rows="10" cols="50" counter="displayDA" maxlength="200" counterTemplate="{0} caracteres restantes" autoResize="true" required="true" requiredMessage="Descripción necesaria"/> <br/> 
     <p:outputLabel id="displayDA"/> <br/> <br/> 

     <p:commandButton value="Guardar Incidencia" action="#{incidenciaBean.insertIncidencia()}" oncomplete="if (#{incidenciaBean.camposNoVacios()}) dlg1.hide()" update=":allIncidenciasAux :allIncidenciasAux:growl"/> 
     <p:messages for="titulo"/> 
     <p:messages for="descripcion"/> 
    </p:dialog>  
</h:form> 

Методы incidenciaBean.java

public void insertIncidencia(){   
    HttpSession httpSession = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true); 
    UsuarioBean usuarioHttp = (UsuarioBean) httpSession.getAttribute("usuarioSession"); 
    this.idComunidad = usuarioHttp.idComunidad; 
    this.idUsuario = usuarioHttp.getIdUsuario(); 
    this.solucionado = false; 
    this.fecha_solucion = null; 
    DateFormat dateFormat = new SimpleDateFormat("DD-MM-YYYY"); 
    Date date = new Date(); 
    this.fecha_publicacion = dateFormat.format(date); 

    if(ejb_incidencia.existIncidenciaTitulo(this.titulo, this.descripcion)){ 
     FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error:", 
       "Ya existe una incidencia con el mismo título y descripción." 
       + "Por favor, compruebe que no se trata de la misma incidencia.")); 
    } else{ 
     ejb_incidencia.realizaRegistroIncidencia(this); 
     FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Info:", 
       "La incidencia se ha registrado correctamente")); 
     initialStatusIncidencia(); 
    } 

} 

public boolean camposNoVacios(){ 
    return !(this.titulo == null || this.descripcion == null); 
} 

public void initialStatusIncidencia(){ 
    this.titulo = null; 
    this.descripcion = null; 
} 

public void handleClose (CloseEvent event){ 
    initialStatusIncidencia(); 
} 
+0

В следующий раз, пожалуйста, начните создание [mcve]. Удалите все больше и больше кода, пока он не начнет работать. Уверен, что если вы измените 'oncomplete = ', если (# {incidenciaBean.camposNoVacios()}) dlg1.hide()" 'to' oncomplete = "dlg1.hide()" 'он работает ..' EL 'там оценивается только при визуализации html. Не тогда, когда нужно вызвать oncomplete. И в следующий раз также всегда публикуйте информацию о версии. См. [Ask] и http://www.stackoverflow.com/tags/jsf/info для – Kukeltje

ответ

0

Вы правы в использовании oncomplete; однако, я не думаю, что ваш оператор if (#{incidenciaBean.camposNoVacios()}) когда-либо оценил значение true. Диалоговое окно только скрывается, если camposNoVacios() возвращает ture (если оба titulo и descripcion не являются null). В заявлении else insertIncidencia() (которое я предполагаю, это случай успеха) вы устанавливаете для них значение null с initialStatusIncidencia().

Так ваша программа устанавливает titulo и descripcion, проверяет, что они не null в insertIncidencia(), а затем устанавливает их null перед проверкой, чтобы увидеть, если они не null с camposNoVacios().