如何在p:对话框的p:dataTable中显示当前行的详细信息,并在保存后更新

我有一个JSF 2应用程序,有两个页面,一个列出学生,一个显示给定学生的详细信息。 列表页面有一个指向学生表格每一行的详细信息页面的链接,在浏览器中打开一个新的标签,点击时显示这些详细信息。

现在需求变成了新的选项卡中的显示细节,但在列表页面的模式对话框中。

我的想法是简单地在模式对话框中embedded细节页面内容,所以列表页面不会太大,难以维护。 这里开始我的怀疑。 经过一番调查,我把列表中每一行的链接改为了下面的button:

<p:commandButton value="Details" type="button" onclick="PF('dialog-details').show()"> </p:commandButton> 

对话框声明如下:

 <p:dialog widgetVar="dialog-details" header="Details" modal="true" width="95%"> <ui:include src="student_details.xhtml"> <ui:param name="id" value="#{student.id}"/> </ui:include> </p:dialog> 

最后,详细信息页面被更改为如下所示:

 <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui" xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets"> <f:metadata> <f:viewParam name="id" value="#{studentBean.id}" /> </f:metadata> <h1 class="title ui-widget-header ui-corner-all">Details of #{studentBean.bean.name} / #{studentBean.bean.number}</h1> </ui:composition> 

当我点击button,对话框显示,内容是详细信息页面。 我在对话框中看到以下内容:

 Details of / 

根本没有错误,但是应该显示的数据不是。 在StudentBean.setId()设置了一个断点(这个方法加载了一个名为bean的属性, Student实例对应于传入的id),但是它从来没有被命中。

经过一段时间的思考,我明白了为什么它不起作用。 传递给详细信息页面的参数是student.id ,但student是在<p:datatable/>中用作var的名称,显示所有学生,所以student<p:dialog/>无效<p:datatable/>

所以,我需要的是一种使用给定行中相应学生的ID显示对话框的方法。 理想情况下,我想在这里调用ajax,所以细节只会在需要时加载。

有任何想法吗?

该button应该是一个ajaxbutton,它在bean中设置当前迭代的实体,然后更新对话框的内容,最后显示它。 对话框应该只引用bean中的实体,并在保存时更新列表和表。

这是一个开球的例子:

 <h:form id="master"> <p:dataTable value="#{bean.entities}" var="entity"> <p:column>#{entity.property1}</p:column> <p:column>#{entity.property2}</p:column> <p:column>#{entity.property3}</p:column> ... <p:column> <p:commandButton value="View" action="#{bean.setEntity(entity)}" update=":detail" oncomplete="PF('detail').show()" /> </p:column> </p:dataTable> </h:form> <p:dialog id="detail" widgetVar="detail"> <h:form> <p:inputText value="#{bean.entity.property1}" /> <p:inputText value="#{bean.entity.property2}" /> <p:inputText value="#{bean.entity.property3}" /> ... <p:button value="Close" onclick="PF('detail').hide(); return false" /> <p:commandButton value="Save" action="#{bean.save}" update=":master" oncomplete="PF('detail').hide()" /> </h:form> </p:dialog> 

有了这个@ViewScoped bean:

 private List<Entity> entities; // +getter private Entity entity; // +getter+setter @EJB private EntityService entityService; @PostConstruct public void load() { entities = entityService.list(); entity = null; } public void save() { entityService.save(entity); load(); } 

也可以看看:

  • 为实体创build主 – 细节页面,如何链接它们以及select哪个bean范围
  • 创build主细节表和对话框,如何重复使用相同的对话框进行创build和编辑
  • 提交后发生validation错误时,请保持p:对话框打开
  • 在<p:dialog>的渲染属性和可见属性之间的区别
  • 如何仅在完成表单提交时显示对话框