p:对话框在使用dialog.hide()时不会触发ajax关闭事件
我正在使用< p:dialog>.在提交表单后,我使用dialog.hide()并激活ajax close事件监听器方法,该方法将更新List< E>.
它运行正常,但是当我放入一些必需的输入组件并带来< p:dialog>如果有一些验证错误,它再也不会触发该方法. 对话框: <p:outputPanel autoUpdate="true"> <p:dialog id="dialogComentario" header="Deixe sua avalia??o" widgetVar="confirmation" showEffect="fade" hideEffect="fade" height="340" width="500" modal="true" visible="#{not empty facesContext.maximumSeverity}" resizable="false" closable="true" draggable="false"> <h:form prependId="false"> ... <p:commandLink styleClass="btn btn-primary btenviacoment" oncomplete="if (!args.validationFailed) confirmation.hide();" actionListener="#{comentario.actEnviarComentario}" global="false"> <i class=" icon-play-circle icon-white"></i> <h:outputText value=" Enviar Comentário" /> <f:param name="codigoplu" value="#{produto.produto.codigoplu}" /> </p:commandLink> ... <p:commandLink styleClass="btn" onclick="confirmation.hide();" global="false" immediate="true"> <h:outputText value=" Cancelar" /> <i class="icon-off"></i> </p:commandLink> ... </h:form> <p:ajax event="close" update=":avaliacoesClientes,:dialogComment" listener="#{produto.atualizarComentarios}" global="false" /> </p:dialog> </p:outputPanel> 动作监听器方法: public void actEnviarComentario(ActionEvent event) { String codigoplu = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("codigoplu"); PegarDadosCliente(); try { DateFormat f = new SimpleDateFormat("dd/MM/yyyy"); java.util.Date utildata = new java.util.Date(); utildata = (java.util.Date) f.parse(String.valueOf(data.getValue())); java.sql.Date datasql = new java.sql.Date(utildata.getTime()); Comentario comentario = new Comentario(Integer.parseInt(usuario.getId()),Integer.parseInt(codigoplu),titulo.getValue().toString(),mensagem.getValue().toString(),datasql,Integer.parseInt(rating.getValue().toString()),new java.sql.Date(new Date().getTime())); listavelComentarios.inserirComentario(comentario); RequestContext.getCurrentInstance().execute("confirmation.hide();"); } catch (NamingException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } } 我尝试使用RequestContext关闭对话框,如操作方法所示,但这也不会触发ajax关闭事件. 这是ajax close事件监听器方法: public void atualizarComentarios(CloseEvent event) { try { comentarios = comentario.listarComentarios(codigoplu); if (comentarios.size() > 0) { msgAvaliacao = "Avalia??o do produto."; int votos = 0; for (Comentario comentario : comentarios) { votos += comentario.getAvaliacao(); } rating = votos / comentarios.size(); } } catch (NamingException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } 解决方法
此问题与验证无关.删除所有这些输入组件并按下命令按钮/链接,你会发现它仍然没有被触发.
此问题是由< p:outputPanel autoUpdate =“true”>的不必要组合引起的.和visible =“#{not empty facesContext.maximumSeverity}”.输出面板会自动更新对话框,这显然会强制您设置类似的可见属性.在触发oncomplete事件之前,该对话框会自动更新.如果对话框visible属性为false,则在触发oncomplete之前,对话框已隐藏(不可见). 所以,只需摆脱< p:outputPanel>和可见属性.你的遗体已经完成了正确的工作. 与具体问题无关,RequestContext行是不必要的.你已经将它隐藏在oncomplete中,这非常好.另见Keep p:dialog open when a validation error occurs after submit. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |