Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 如何在p:对话框中显示p:dataTable中当前行的详细信息,并在保存后更新_Jsf_Primefaces_Datatable_Dialog_Master Detail - Fatal编程技术网

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

Jsf 如何在p:对话框中显示p:dataTable中当前行的详细信息,并在保存后更新,jsf,primefaces,datatable,dialog,master-detail,Jsf,Primefaces,Datatable,Dialog,Master Detail,我有一个JSF2应用程序,它有两个页面,一个用于列出学生,另一个用于显示给定学生的详细信息。列表页面在students表的每一行中都有一个指向details页面的链接,单击该链接可在浏览器中打开一个新选项卡以显示这些详细信息 现在,需求更改为不再在新选项卡中显示详细信息,而是在列表页面的模式对话框中显示详细信息 我的想法是简单地将细节页面内容嵌入到模式对话框中,这样列表页面就不会变得太大和难以维护。我开始怀疑了。经过一些研究,我将列表中每一行的链接更改为以下按钮: <p:commandBu

我有一个JSF2应用程序,它有两个页面,一个用于列出学生,另一个用于显示给定学生的详细信息。列表页面在students表的每一行中都有一个指向details页面的链接,单击该链接可在浏览器中打开一个新选项卡以显示这些详细信息

现在,需求更改为不再在新选项卡中显示详细信息,而是在列表页面的模式对话框中显示详细信息

我的想法是简单地将细节页面内容嵌入到模式对话框中,这样列表页面就不会变得太大和难以维护。我开始怀疑了。经过一些研究,我将列表中每一行的链接更改为以下按钮:

<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();
}