我正在尝试在PrimeFaces 4 DataTable上实现一个即时行选择,该数据弹出了一个来自选定行的详细信息。
相关代码段为:
数据词:
<p:dataTable id="Table"
var="user" rowKey="#{user.id}"
selection="#{userDAO.selectedComplaintRow}"
selectionMode="single" value="#{userDAO.complaintList}"
style="font-size:10px;">
<p:ajax event="rowSelect" listener="#{userDAO.onRowSelect}"
update=":form:Table, :form:messages"
oncomplete="PF('showComplaint').show()" />
...
对话框:
<p:dialog header="Details" widgetVar="showComplaint"
id="dialog" resizable="false" width="400" showEffect="explode"
modal="true" hideEffect="explode">
<h:panelGrid columns="3" cellpadding="5">
<h:outputText value="Forename: " />
<h:outputText value="#{userDAO.selectedComplaintRow.getForename()}" />
</h:panelGrid>
</p:dialog>
userdao.onrowselect():
public void onRowSelect(SelectEvent event) {
FacesMessage msg = new FacesMessage("User Selected", "Selected!");
FacesContext.getCurrentInstance().addMessage(null, msg);
}
用户dao getter和setter:
public void setSelectedComplaintRow(User selectedComplaintRow) {
this.selectedComplaintRow = selectedComplaintRow;
System.out.println("Passed forename: " + this.selectedComplaintRow.getForename());
}
public User getSelectedComplaintRow() {
System.out.println("Retrieved forename: " + this.selectedComplaintRow.getForename());
return this.selectedComplaintRow;
}
用户getter和setter:
public String getForename() {
return this.forename;
}
public void setForename(String forename) {
this.forename = forename;
}
(老式)System.out.println()
成功地从用户实体bean获取了forename并将其打印到eclipse控制台时,在对话框打开时," foreName"的右侧空间是空白的:由#{userDAO.selectedComplaintRow.getForename()}
绑定。
数据表和对话框都在同一标签内。
可能是什么原因?
解决了我所做的那样,如@scraatz所建议,并将update=":form:dialog"
添加到rowSelect
AJAX事件中:
<p:ajax event="rowSelect" listener="#{bigComplaintsDAO.onRowSelect}"
update=":form:ComplaintTable, :form:messages, :form:dialog"
oncomplete="PF('showComplaint').show()" />
这似乎是在将数据传递给数据后更新对话框,而没有此,对话框已加载到任何数据传递给它之前加载,并且当数据随后通过#{userDAO.selectedComplaintRow.forename}
传递到该数据时不会更新。