2

我想显示带有单选的项目列表。在选择一个项目时,应该会出现一个对话框,显示该项目的详细信息。到目前为止,列表和选择甚至一些细节都在显示,但嵌套列表是空的。

JSF 来源:

<f:view>
      <h:form id="studyListForm">
        <!-- Main list with selectable Items -->
        <h:outputText value="Study List"/>
        <p:dataTable id="studyList" selection="#{studyRepositoryController.selectedStudy}" selectionMode="single" value="#{studyRepositoryController.studyList}" var="item">

          <p:ajax event="rowSelect" listener="#{studyRepositoryController.onRowSelect}"   
              update=":studyListForm:display :studyListForm:studyPropertyList :headnavigation:growl" oncomplete="studyDialog.show()" />  

          <p:ajax event="rowUnselect" listener="#{studyRepositoryController.onRowUnselect}" update=":headnavigation:growl" />

          <p:column headerText="ID" >
            <h:outputText value="#{item.id}"/>
          </p:column>
          <p:column headerText="Name">
            <h:outputText value="#{item.name}"/>
          </p:column>
        </p:dataTable>

        <!-- The dialog for a single item -->
        <p:dialog id="dialog" width="600" height="400" header="Study" widgetVar="studyDialog" resizable="true" showEffect="fade" hideEffect="explode">
          <!-- Study Details -->
          <h:panelGrid id="display" columns="2" cellpadding="4" rowClasses="aligntop">
            <h:outputText value="ID"/>
            <h:outputText value="#{studyRepositoryController.selectedStudy.id}"/>

            <h:outputText value="Name"/>
            <h:outputText value="#{studyRepositoryController.selectedStudy.name}"/>

          </h:panelGrid>

          <!-- Property List -->
          <p:dataTable id="studyPropertyList" value="#{studyRepositoryController.selectedStudy.studyPropertyList}" var="item">
            <p:column headerText="ID" >
              <h:outputText value="#{item.id}"/>
            </p:column>
            <p:column headerText="property" >
              <h:outputText value="#{item.property}"/>
            </p:column>
            <p:column headerText="text_value" >
              <h:outputText value="#{item.textValue}"/>
            </p:column>
          </p:dataTable>
        </p:dialog>
      </h:form>
    </f:view>

正如所解释的,它大部分都有效。显示主列表,当我单击一个项目时,会出现显示所选项目的 ID 和名称的对话框。但是嵌套列表

#{studyRepositoryController.selectedStudy.studyPropertyList}

是空的。所以数据表没有显示任何行: 在此处输入图像描述

列表本身是一个简单的数据库实体:

  public PrimeStudy getStudyList(){
    log.info("-!-");
    List<Study> list = (List<Study>) em.createNamedQuery("Study.findAll").getResultList();

    Iterator<Study> it = list.iterator();
    while(it.hasNext()){
      Study s = it.next();
      log.debug("Study " + s.getId() + " PropertyListSize:" + s.getStudyPropertyList().size());
    }
    PrimeStudy modelList = new PrimeStudy(list);

    return modelList;
  }

调试输出显示:

 -!-
 Study 1 PropertyListSize:2
 Study 2 PropertyListSize:0
 Study 3 PropertyListSize:0
 Study 4 PropertyListSize:0
 Study 5 PropertyListSize:0

有什么建议么?

[更新] 我按照 partlov 的建议在 ajax 事件中添加了缺少的 dataTable 更新,以显示一个有效的解决方案。

4

2 回答 2

2

如我所见,您没有更新您的 second dataTable。添加studyPropertyList到您的事件更新列表p:ajax以选择行。此外,您真的不应该在 getter 中创建列表,而是在@PostConstruct方法中执行此操作,因为在页面生命周期中多次调用 getter。

于 2013-03-14T08:24:51.000 回答
0

不要在 Getter 方法中创建新列表。在 Bean 的构造函数中预先生成列表,或者如 partlov 所说,使用 @PostConstruct 方法。

于 2013-03-14T09:04:07.577 回答