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

Ale*_*ert 2 jsf primefaces jsf-2

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

它在例子中非常精细.但是如果我使用ap: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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 8

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>
Run Code Online (Sandbox Code Playgroud)

和:

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>
Run Code Online (Sandbox Code Playgroud)

它工作得很好:)