我有一个包含两个输入字段和一个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();
}
答案 0 :(得分:0)
您使用oncomplete
是正确的;但是,我不认为你的if (#{incidenciaBean.camposNoVacios()})
陈述曾经评估过真。如果camposNoVacios()
返回ture(如果titulo
和descripcion
都不是null
),则只会隐藏对话框。在insertIncidencia()
的else语句中(我假设是成功案例),您使用initialStatusIncidencia()
将它们设置为null。
因此,您的计划设置titulo
和descripcion
,检查null
中的insertIncidencia()
是否null
,然后在检查之前将其设置为null
看看他们是否camposNoVacios()
与id | tipodemonstrativo | anoreferencia
---+-------------------+--------------
01 | AN | 2015
02 | AN | 2016
03 | SE | 2014
04 | PB | 2015
。