在使用ajax刷新表单后,我需要您的帮助和指导来解决显示dialog
的问题。我的dataTable
显示了commandButton
视图的大量请求和点击,将显示包含一些信息的dialog
。接下来dialog
,表单将被刷新,dataTable将从数据库中获取更新的信息。但是,这是第一次显示对话框,关闭dialog
将刷新表单。
如果我第二次尝试再次点击视图commandButton
,commandButton
将不显示任何对话框,似乎也无法执行操作。即使是日志也没有显示任何内容。
这是我的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();
}
答案 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>