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 が提案したように、欠落している dataTable の更新を ajax イベントに追加して、実用的なソリューションを示しました。

4

2 に答える 2

2

ご覧のとおり、2番目の を更新していませんdataTable。行を選択するためのイベントのstudyPropertyList更新リストに追加します。p:ajaxまた、getter でリストを作成するべきではありません@PostConstruct。getter はページのライフサイクル中に複数回呼び出されるため、メソッドで作成してください。

于 2013-03-14T08:24:51.000 に答える
0

Getter メソッドで新しい List を作成しないでください。Beanのコンストラクターでリストを事前に生成するか、partlovが言ったように@PostConstructメソッドを使用します。

于 2013-03-14T09:04:07.577 に答える