5

を使用して<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 close イベントを発生させません。

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

1 に答える 1

3

この問題は検証とは関係ありません。これらの入力コンポーネントをすべて削除し、コマンド ボタン/リンクを押すと、まだ起動されていないことがわかります。

この問題は、 と の不必要な組み合わせが原因で発生し<p:outputPanel autoUpdate="true">ますvisible="#{not empty facesContext.maximumSeverity}"visible出力パネルはダイアログを自動更新し続け、明らかにそのような属性を設定するように強制します。oncompleteダイアログは、イベントが発生する直前に自動更新されます。ダイアログvisibleプロパティがの場合、ダイアログは が起動falseされる前にすでに非表示 (非表示) になっていoncompleteます。

<p:outputPanel>したがって、属性と属性を取り除くだけvisibleです。あなたoncompleteはすでに正しい仕事をしています。


具体的な問題とは関係ありませんが、RequestContext線は不要です。あなたはすでにそれを隠していますが、oncompleteそれはまったく問題ありません。submit 後に検証エラーが発生したときに p:dialog を開いたままにするも参照してください。

于 2013-01-16T15:29:14.103 に答える