Jsf 如何在p:对话框中显示p:dataTable中当前行的详细信息,并在保存后更新
我有一个JSF2应用程序,它有两个页面,一个用于列出学生,另一个用于显示给定学生的详细信息。列表页面在students表的每一行中都有一个指向details页面的链接,单击该链接可在浏览器中打开一个新选项卡以显示这些详细信息 现在,需求更改为不再在新选项卡中显示详细信息,而是在列表页面的模式对话框中显示详细信息 我的想法是简单地将细节页面内容嵌入到模式对话框中,这样列表页面就不会变得太大和难以维护。我开始怀疑了。经过一些研究,我将列表中每一行的链接更改为以下按钮:Jsf 如何在p:对话框中显示p:dataTable中当前行的详细信息,并在保存后更新,jsf,primefaces,datatable,dialog,master-detail,Jsf,Primefaces,Datatable,Dialog,Master Detail,我有一个JSF2应用程序,它有两个页面,一个用于列出学生,另一个用于显示给定学生的详细信息。列表页面在students表的每一行中都有一个指向details页面的链接,单击该链接可在浏览器中打开一个新选项卡以显示这些详细信息 现在,需求更改为不再在新选项卡中显示详细信息,而是在列表页面的模式对话框中显示详细信息 我的想法是简单地将细节页面内容嵌入到模式对话框中,这样列表页面就不会变得太大和难以维护。我开始怀疑了。经过一些研究,我将列表中每一行的链接更改为以下按钮: <p:commandBu
<p:commandButton value="Details" type="button"
onclick="PF('dialog-details').show()">
</p:commandButton>
完全没有错误,但是应该显示的数据没有错误。在StudentBean.setId()
中设置了断点(此方法使用与传递的id对应的Student
实例加载名为bean
的属性),但从未命中该断点
经过一段时间的思考,我终于明白了为什么它不起作用。传递到详细信息页面的参数是student.id
,但是student
是在显示所有学生的
中用作变量的名称,因此student
在
之外的
中无效
所以,我需要的是一种使用给定行中相应学生的id显示对话框的方法。理想情况下,我希望这里有一个ajax调用,因此只有在neded时才会加载详细信息
有什么想法吗?这个按钮应该是一个ajax按钮,它在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="if(!args.validationFailed) PF('detail').hide()" />
</h:form>
</p:dialog>
另见:
我将研究视图
标记,但我在“详细信息”页面的上一版本中没有使用它,当它显示在其他浏览器选项卡中时,它工作正常。@BalusC:谢谢你的提示,但这对我没有帮助。我没有添加关于我的问题的一些细节:我的列表页面是一个合成页面,使用了一个模板,实际上有一个
标记,因此该对话框确实是帖子通知的
的子对话框。不管怎样,我非常感谢你试图帮助我@巴卢斯:太好了!您的回答对我来说非常有效,除了我必须将实体id传递到将包含的另一个页面的部分。似乎参数根本没有进入详细信息视图。@Alex:我不理解功能需求。请澄清。你的意思是你想在对话框中有一个指向另一页的
,你需要以
的形式传递{entity.id}
?@Balus:基本上你是这么理解的,但是要显示的细节非常广泛,我已经在另一页中完成了(另一个XHTML文件,记住当前的实现在另一个浏览器选项卡中显示这些详细信息)。因此,我想做的是在对话框中显示详细信息页面内容。然后将原始页面拆分为可以通过
包含在对话框中的内容,或者使用primefaces对话框框架。非常感谢)
<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 /
<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="if(!args.validationFailed) PF('detail').hide()" />
</h:form>
</p:dialog>
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();
}