p:dialog 在使用 dialog.hide() 时不会触发 ajax 关闭事件

Vic*_*llo 5 validation ajax jsf dialog primefaces

我正在使用<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>
Run Code Online (Sandbox Code Playgroud)

动作监听器方法:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试关闭对话框,RequestContext如操作方法中所示,但这也不会触发 ajax 关闭事件。

这是ajax关闭事件监听器方法:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 3

此问题与验证无关。删除所有这些输入组件并按命令按钮/链接,您会发现它仍然没有被触发。

<p:outputPanel autoUpdate="true">这个问题是由于和不必要的组合造成的visible="#{not empty facesContext.maximumSeverity}"。输出面板不断自动更新对话框,这显然迫使您visible像这样设置属性。oncomplete该对话框会在事件触发之前自动更新。如果对话框visible属性为,则在触发false之前该对话框已隐藏(不可见) 。oncomplete

因此,只需去掉 the<p:outputPanel>visible属性即可。你oncomplete已经做了正确的工作。


与具体问题无关RequestContext,这条线是不必要的。你已经把它藏起来了,oncomplete这很好。另请参阅在提交后发生验证错误时保持 p:dialog 打开