JSF:将页面动态包含到primefaces对话框中

Posted

技术标签:

【中文标题】JSF:将页面动态包含到primefaces对话框中【英文标题】:JSF: Dynamic include page into primefaces dialog 【发布时间】:2014-07-22 14:00:33 【问题描述】:

我想使用 ui:include 包含来自另一个页面的 primefaces 对话框的内容。包含的页面必须根据用户单击的按钮设置为动态的。我使用了来自 JSF dynamic include using Ajax request 的 BalusC 的非常有用的答案。

它在示例中工作得非常好。但是如果我使用 p:dialog 而不是 h:panelGroup 就会出现问题:

<h:form>
  <f:ajax render=":dialog">
    <p:commandButton value="page1" action="#productBean.setDialogPage('/page1.xhtml')" oncomplete="dialogWidget.show()"></p:commandButton>
    <p:commandButton value="page2" action="#productBean.setDialogPage('/page2.xhtml')" oncomplete="dialogWidget.show()"></p:commandButton>
  </f:ajax>
</h:form>
<p:dialog id="dialog" widgetVar="dialogWidget" >
        <ui:include src="#productBean.dialogPage" />
</p:dialog>

第一个问题:有时,我必须在对话框出现之前多次单击一个按钮。它似乎没有遵循任何模式,而是一种随机效应。有时需要单击两次,有时需要单击按钮四次。

第二个问题:有时,对话框出现的不是所选页面而是旧页面。当我关闭对话框并再次选择时,将加载当前页面。这似乎也是一种随机效应。

为什么我会在对话框中遇到这个问题?

【问题讨论】:

我在 Bean 中调试了 getDialogPage() 和 setDialogPage() 的调用。我注意到,当一切正常时,调用顺序是 get-SET-get-get-get。但是当我得到旧的错误页面时,顺序是get-get-get-SET-get。 【参考方案1】:

如果您使用 Netbeans 8 对现有表进行逆向工程(生成实体 + 生成 jsf 页面),它将执行非常类似的开箱即用操作;在列表页面上有一个创建按钮,它显示了另一个页面中包含的对话框。您应该尝试一下,请务必在生成jsf页面指南的最后一页中选择“primefaces”。他们这样做:

列表.xhtml:

<p:commandButton id="createButton" icon="ui-icon-plus"   value="#bundle.Create" actionListener="#kornstoranalyseStdController.prepareCreate" update=":KornstoranalyseStdCreateForm" oncomplete="PF('KornstoranalyseStdCreateDialog').show()" />

Create.xhtml 包含在列表页中&lt;/h:form&gt; 下方的&lt;ui:include src="Create.xhtml"/&gt; 中。

Create.xhtml 开头:

 <ui:composition>

    <p:dialog id="KornstoranalyseStdCreateDlg"  widgetVar="KornstoranalyseStdCreateDialog" modal="true" resizable="true" showEffect="clip" appendTo="@(body)" header="#bundle.CreateKornstoranalyseStdTitle" hideEffect="clip" position="top">
        <h:form id="KornstoranalyseStdCreateForm">

希望您可以根据自己的需要进行调整。

【讨论】:

【参考方案2】:

你, 我不知道你为什么使用这种模式来显示动态对话框, 对我来说,我喜欢使用这种模式:

<h:form>
<p:commandButton value="page1"
    actionListener="#productBean.setDialogPage('page1')" oncomplete="PF('dialogWidget').show()" update="dialog"/>
<p:commandButton value="page2"
    actionListener="#productBean.setDialogPage('page2')" oncomplete="PF('dialogWidget').show()" update="dialog"/>
</h:form>

<p:dialog id="dialog" widgetVar="dialogWidget">
    <ui:include src="/#productBean.dialogPage.xhtml" />
</p:dialog>

和:

page1.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui">

    <h:form>
           <!-- your code -->
    </h:form>
</ui:composition>

一切正常:)

【讨论】:

以上是关于JSF:将页面动态包含到primefaces对话框中的主要内容,如果未能解决你的问题,请参考以下文章

JSF 2.0 更新 primefaces 对话框第一次不起作用

如何从jsf / primefaces中的托管bean向页面添加组件[重复]

将 PrimeFaces 与 JSF 一起使用时 Shiro 重定向到错误的位置

JSF/Primefaces 如何将另一个域中的 .xhtml 包含到您的 .xhtml 中

JSF 2.0 无法从 primefaces 呈现对话框

Primefaces 6.0 对话框框架和框架集