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

时间:2014-06-02 12:38:18

标签: jsf jsf-2 primefaces

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

它在例子中非常精细。但是如果我使用p:对话框而不是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>

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

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

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

2 个答案:

答案 0 :(得分:7)

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

<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>

它的工作正常:)

答案 1 :(得分:1)

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

List.xhtml:

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

Create.xhtml包含在列表页面<ui:include src="Create.xhtml"/>下面的</h:form>中。

Create.xhtml以:

开头
 <ui:composition>

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

希望您可以调整以满足您的需求。