4

我有一个数据表,它将在行选择事件上显示一个详细对话框。但是,该对话框不显示所选对象的任何值。我可以看到在调试会话期间正确设置了所选对象。

该表由学生行组成,假设显示一个弹出对话框,显示有关行选择事件的详细信息。

学生豆:

@Named(value = "studentBean")
@SessionScoped
public class StudentBean {

        @Inject
        private UserFacade userFacade;
        private List<User> studentList;
        private User selectedStudent;


        public StudentBean() {
        }

        @PostConstruct
        public void init() {
            studentList = userFacade.findAll();

        }


        public List<User> getStudentList() {
            return studentList;

        }


        public void setStudentList(List<User> studentList) {
            this.studentList = studentList;
        }


        public User getSelectedStudent() {
            return selectedStudent;
        }


        public void setSelectedStudent(User student) {
            this.selectedStudent = student;
        }

        public void onRowSelect(SelectEvent event) {
        }

        public void onRowUnselect(UnselectEvent event) {
            //FacesMessage msg = new FacesMessage("Student Unselected", ((User) event.getObject()).getFirstName());  
            //FacesContext.getCurrentInstance().addMessage("messages", msg);  
        }


    }

Facelet 页面:

<?xml version='1.0' encoding='UTF-8' ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:ui="http://java.sun.com/jsf/facelets"
          xmlns:h ="http://java.sun.com/jsf/html"
          xmlns:p ="http://primefaces.org/ui">

        <body>

            <ui:composition template="./layout.xhtml">

                <ui:define name="content">
                    <h:form  id="studentForm"> 


                        <p:dataTable var="student" value="#{studentBean.studentList}" 
                                     selectionMode="single" 
                                     selection="#{studentBean.selectedStudent}" rowKey="#{student.id}">  

                            <p:ajax event="rowSelect" listener="#{studentBean.onRowSelect}" 
                                    update=":studentForm:studentDetail" oncomplete="studentDialog.show()" 
                                    global="true" immediate="true"
                                    />  
                            <p:ajax event="rowUnselect" listener="#{studentBean.onRowUnselect}" /> 


                            <p:column headerText="First Name">  
                                <h:outputText value="#{student.firstName}" />  
                            </p:column>  

                            <p:column headerText="Last Name">  
                                <h:outputText value="#{student.lastName}" />  
                            </p:column>  

                            <p:column headerText="Student ID">  
                                <h:outputText value="#{student.studentid}" />  
                            </p:column>  

                        </p:dataTable>  



                        <p:dialog id="dialog" header="Student Detail"  widgetVar="studentDialog" resizable="false"  
                                  showEffect="fade" hideEffect="fade" appendToBody="true">  

                            <h:panelGrid id="studentDetail" columns="2" cellpadding="4">  

                                <h:outputText value="First Name: " />  
                                <h:outputText value="#{studentBean.selectedStudent.firstName}" />  

                                <h:outputText value="Last Name: " />  
                                <h:outputText value="#{studentBean.selectedStudent.lastName}" />  

                            </h:panelGrid>  
                        </p:dialog> 
                </ui:define>

            </ui:composition>

        </body>
    </html>

我正在关注 Primefaces Showcase 页面中的 Car 数据表示例。那里看起来很简单,但无论我做什么,我似乎都无法显示 selectedStudent 信息。对话框显示正常,但 firstName 和 lastName 值为空。

我尝试了以下方法:

  • 将对话框放入另一种形式
  • 使用 process="@form"
  • 使用流程=":studentForm:studentDetail"

我究竟做错了什么?

Primefaces 3.3.1,Glassfish 3.1.2

4

1 回答 1

0

我删除了global="true" immediate="true",未使用的听众

from p:ajax, synchronized rowKey="#{student.id}" 

使用“学生 ID”列中的表达式和@PostConstruct init()函数内部填充的 studentList,不知道您的 userFacade 代码是如何的,并且它可以工作。

于 2012-09-26T23:32:51.747 回答