【发布时间】:2015-10-22 17:59:15
【问题描述】:
我有一个 JSF 2 应用程序,它有两个页面,一个用于列出学生,一个用于显示给定学生的详细信息。列表页面在学生表的每一行中都有一个指向详细信息页面的链接,单击该链接会在浏览器中打开一个新选项卡以显示这些详细信息。
现在要求更改为不再在新选项卡中显示详细信息,而是在列表页面的模式对话框中。
我的想法是简单地将详细信息页面内容嵌入模式对话框中,这样列表页面就不会变得太大且难以维护。这里开始我的疑惑。经过一番研究,我将列表每一行中的链接更改为以下按钮:
<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>
当我单击按钮时,对话框真正显示,内容是详细信息页面。我在对话框中看到以下内容:
Details of /
完全没有错误,但应该显示的数据却没有。在StudentBean.setId() 中设置了一个断点(此方法加载了一个名为bean 的属性,其中Student 实例对应于传递的id)但它永远不会被命中。
经过一段时间的思考,我开始明白为什么它不起作用了。传递给详细信息页面的参数是student.id,但student是在显示所有学生的<p:datatable/>中用作var的名称,因此student在外部<p:dialog/>中无效<p:datatable/>。
所以,我需要一种使用给定行中相应学生的 id 来显示对话框的方法。理想情况下,我希望在此处调用 ajax,因此只有在需要时才会加载详细信息。
有什么想法吗?
【问题讨论】:
-
我会研究
view标签,但我没有在以前版本的详细信息页面中使用它,当它在不同的浏览器选项卡中显示时可以正常工作。 -
@BalusC:感谢您的提示,但对我没有帮助。我没有添加有关我的问题的一些细节:我的列表页面是一个组合,并使用一个实际上具有
<f:view/>标记的模板,因此该对话框确实是<f:view/>的子项,正如帖子所告知的那样。无论如何,我非常感谢您尝试帮助我!
标签: jsf primefaces datatable dialog master-detail