在ajax表单刷新后,Primefaces commandButton没有显示对话框

时间:2015-05-26 13:54:26

标签: ajax jsf primefaces

在使用ajax刷新表单后,我需要您的帮助和指导来解决显示dialog的问题。我的dataTable显示了commandButton视图的大量请求和点击,将显示包含一些信息的dialog。接下来dialog,表单将被刷新,dataTable将从数据库中获取更新的信息。但是,这是第一次显示对话框,关闭dialog将刷新表单。

如果我第二次尝试再次点击视图commandButtoncommandButton将不显示任何对话框,似乎也无法执行操作。即使是日志也没有显示任何内容。

这是我的xhtml:

<h:form id="Requests">
    <p:dataTable id="PendingRequests" var="hr" value="#{hrd.pendingRequests}"
            filteredValue="#{hrd.filteredPendingRequests}">
        <p:column headerText="Req. Date" sortBy="#{hr.requestDate}"
                filterMatchMode="contains" filterBy="#{hr.requestDate}">
            <h:outputText value="#{hr.requestDate}" />
        </p:column>
        <p:column>
            <f:facet name="header">View</f:facet>
            <p:commandButton id="submitbutton" update=":Requests:#{hr.dialogueName} "
                    oncomplete="PF('#{hr.certificateDialogue}').show()" icon="ui-icon-search"
                    title="View">
                <f:setPropertyActionListener value="#{hr}" target="#{hrd.selectedRequest}" />
            </p:commandButton>
        </p:column>
    </p:dataTable>
    <p:dialog id="CertificateDialog" header="Cert1" widgetVar="CertificateDialog">
        <p:ajax event="close" update=":Requests" listener="#{hrd.UpdateDatatable}" />
    </p:dialog>
</h:form>

此方法将在dialog的onclose上调用.UpdateDatatable方法代码为:

listPendingRequests.clear();
listPendingRequests = new ArrayList<PendingRequests>();
PreparedStatement ps = null;
String sql = "";

try {
    con = DBConn.getInstance().getConnection("jdbc/hr");

    // SQL Statement
    ps = con.prepareStatement(sql);
    ResultSet result = ps.executeQuery();
    while (result.next()) {
        PendingRequests pendingList = new PendingRequests();

        requestDate = result.getString("REQ_DT");

        pendingList.setRequestDate(requestDate);

        listPendingRequests.add(pendingList);

        RequestContext.getCurrentInstance().update("Requests");
    }
} catch (Exception e) {
    System.err.print(e);
    e.printStackTrace();
}

1 个答案:

答案 0 :(得分:1)

对话框在HTML DOM和JavaScript中有特殊处理。在同一视图中,您永远不应该对任何对话框的父母进行ajax更新。否则,您最终可能会在JS中出现重复的对话框和冲突。此外,strong recommendation是为了给每个对话框提供与<p:dialog><h:form>中一样的自己的形式,以避免被初学者混淆和误用,但是当你想在其上使用ajax关闭事件时,{{3}而是使用<h:form><p:dialog>代替。但是,您将其他内容放在同一个表单中,您甚至可以更新它。这不对。

将表单绑定到对话框本身,不要在其上放置其他内容。换句话说,拆分当前表格。

<h:form id="requests">
    <p:dataTable ...>
        ...
    </p:dataTable>
</h:form>
<h:form>
    <p:dialog ...>
        <p:ajax event="close" ... update=":requests" />
    </p:dialog>
</h:form>