outputText没有调用backing bean方法

时间:2014-01-25 16:02:32

标签: jsf jsf-2 primefaces datatable

我正在尝试在PrimeFaces 4数据表上实现即时行选择,该数据表弹出一个包含所选行详细信息的对话框。

相关的代码段是:

数据表:

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

UserDAO 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;
}

当(old-school)System.out.println()从User实体bean成功获取forename并将其打印到Eclipse控制台时,当对话框打开时,“Forename:”右侧的空格为空白如果#{userDAO.selectedComplaintRow.getForename()}绑定传递了null。

数据表和对话框都在同一个标​​签内。

可能导致这种情况的原因是什么?

1 个答案:

答案 0 :(得分:0)

为了解决这个问题,我按照@scraatz的建议做了,并将update=":form:dialog"添加到rowSelect ajax事件中,如下所示:

<p:ajax event="rowSelect" listener="#{bigComplaintsDAO.onRowSelect}" 
    update=":form:ComplaintTable, :form:messages, :form:dialog" 
    oncomplete="PF('showComplaint').show()" />

这似乎是在数据传递给它之后更新对话框,而没有这个,对话框在传递任何数据之前加载,并且当数据随后通过{{1}传递给它时不会更新}。