【问题标题】:Primefaces dialog doesn't close when action is completed [duplicate]操作完成后Primefaces对话框不会关闭[重复]
【发布时间】:2016-10-15 15:51:08
【问题描述】:

我有一个带有两个输入字段和一个命令按钮的对话框,用于添加一个对象。如果用户留下空白字段,则会显示消息咆哮并且对话框保持打开状态。但是,如果用户填写完所有字段并按下 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();
}

【问题讨论】:

  • 下次请开始创建minimal reproducible example。删除越来越多的代码,直到它开始工作。我敢打赌,如果您将oncomplete="if (#{incidenciaBean.camposNoVacios()}) dlg1.hide()" 更改为oncomplete="dlg1.hide()",它会起作用。只有在呈现html 时才会评估其中的“EL”。不是在需要调用 oncomplete 时。下一次也总是发布版本信息。请参阅How to Askstackoverflow.com/tags/jsf/info

标签: jsf primefaces dialog growl


【解决方案1】:

你使用oncomplete是正确的;但是,我认为您的 if (#{incidenciaBean.camposNoVacios()}) 声明永远不会评估为 true。只有camposNoVacios() 返回 ture(如果titulodescripcion 都不是null),对话框才会隐藏。在insertIncidencia() 的else 语句(我认为这是成功案例)中,您使用initialStatusIncidencia() 将它们设置为null。

所以你的程序设置titulodescripcion,检查它们在insertIncidencia() 中是否不是null,然后将它们设置为null,然后再检查它们是否不是null camposNoVacios()

【讨论】:

    猜你喜欢
    • 2012-09-20
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    相关资源
    最近更新 更多