如何在ap:dialog中显示p:dataTable中当前行的详细信息并保存后进行更新

我有一个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所使用的名称为var中<p:datatable/>,显示所有的学生,所以student是无效在<p:dialog/>这之外<p:datatable/>。


因此,我需要的是一种使用给定行中相应学生的ID显示对话框的方法。理想情况下,我希望在这里进行ajax调用,因此仅在需要时才加载详细信息。


有任何想法吗?


UYOU
浏览 310回答 1
1回答

牛魔王的故事

该按钮应该是一个ajax按钮,它设置Bean中当前迭代的实体,然后更新对话框的内容,并最终显示它。该对话框应仅引用bean中的该实体,并在保存时更新列表和表。这是一个启动示例:<h:form id="master">&nbsp; &nbsp; <p:dataTable value="#{bean.entities}" var="entity">&nbsp; &nbsp; &nbsp; &nbsp; <p:column>#{entity.property1}</p:column>&nbsp; &nbsp; &nbsp; &nbsp; <p:column>#{entity.property2}</p:column>&nbsp; &nbsp; &nbsp; &nbsp; <p:column>#{entity.property3}</p:column>&nbsp; &nbsp; &nbsp; &nbsp; ...&nbsp; &nbsp; &nbsp; &nbsp; <p:column>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <p:commandButton value="View" action="#{bean.setEntity(entity)}"&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; update=":detail" oncomplete="PF('detail').show()" />&nbsp; &nbsp; &nbsp; &nbsp; </p:column>&nbsp; &nbsp; </p:dataTable></h:form><p:dialog id="detail" widgetVar="detail">&nbsp; &nbsp; <h:form>&nbsp; &nbsp; &nbsp; &nbsp; <p:inputText value="#{bean.entity.property1}" />&nbsp; &nbsp; &nbsp; &nbsp; <p:inputText value="#{bean.entity.property2}" />&nbsp; &nbsp; &nbsp; &nbsp; <p:inputText value="#{bean.entity.property3}" />&nbsp; &nbsp; &nbsp; &nbsp; ...&nbsp; &nbsp; &nbsp; &nbsp; <p:button value="Close" onclick="PF('detail').hide(); return false" />&nbsp; &nbsp; &nbsp; &nbsp; <p:commandButton value="Save" action="#{bean.save}"&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; update=":master" oncomplete="PF('detail').hide()" />&nbsp; &nbsp; </h:form></p:dialog>将其放入一个@ViewScopedbean中:private List<Entity> entities; // +getterprivate Entity entity; // +getter+setter@EJBprivate EntityService entityService;@PostConstructpublic void load() {&nbsp; &nbsp; entities = entityService.list();&nbsp; &nbsp; entity = null;}public void save() {&nbsp; &nbsp; entityService.save(entity);&nbsp; &nbsp; load();}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java