操作完成后,Primefaces对话框不会关闭

时间:2016-06-14 18:58:07

标签: jsf primefaces dialog growl

我有一个包含两个输入字段和一个commandButton的对话框,用于添加对象。如果用户留下空白字段,则会显示消息咆哮并且对话框保持打开状态。但是,如果用户完成所有字段并按下commandButton,则会添加对象,但对话框不会关闭。

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

1 个答案:

答案 0 :(得分:0)

您使用oncomplete是正确的;但是,我不认为你的if (#{incidenciaBean.camposNoVacios()})陈述曾经评估过真。如果camposNoVacios()返回ture(如果titulodescripcion都不是null),则只会隐藏对话框。在insertIncidencia()的else语句中(我假设是成功案例),您使用initialStatusIncidencia()将它们设置为null。

因此,您的计划设置titulodescripcion,检查null中的insertIncidencia()是否null,然后在检查之前将其设置为null看看他们是否camposNoVacios()id | tipodemonstrativo | anoreferencia ---+-------------------+-------------- 01 | AN | 2015 02 | AN | 2016 03 | SE | 2014 04 | PB | 2015