単一選択でアイテムのリストを表示したい。アイテムを選択すると、そのアイテムの詳細を示すダイアログが表示されます。これまでのところ、リストと選択、さらには詳細が表示されていますが、ネストされたリストは空です。
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 イベントに追加して、実用的なソリューションを示しました。