我想显示带有单选的项目列表。在选择一个项目时,应该会出现一个对话框,显示该项目的详细信息。到目前为止,列表和选择甚至一些细节都在显示,但嵌套列表是空的。
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 更新,以显示一个有效的解决方案。