有条件地在Primefaces中显示对话而没有后端干预

时间:2014-07-07 18:09:12

标签: jsf-2 primefaces dialog

我正在尝试在Primefaces 5.0中有条件地弹出一个对话框而不使用<p:commandButton>后端。

我看过hereherehere,并尝试了所提供的每个解决方案,但都没有。

我遇到的问题是当你点击按钮时如何让对话框显示在页面上;在那之前,一切似乎都很顺利。

按钮的XHTML:

<c:choose>
  <c:when test="#{businessLayer.context eq 'REF_INFO'}">
    <p:commandButton value="Submit PA"
                     disabled="#{outcomes.size() eq 0 or businessLayer.ticket eq null}"
                     onclick="PF('refInfoDialog').show()"
                     actionListener="#{businessLayer.splund('submitting ref info pa')}"
                     type="button"/>
                <!-- onstart="PF('loadingResults').show()"
                     onerror="PF('errorDialog').show()"
                     oncomplete="PF('loadingResults').hide(); PF('refInfoDialog').show()"-->
  </c:when>
  <c:when test="#{businessLayer.context eq 'FAXBACK'}">
    <p:commandButton value="Submit PA"
                     disabled="#{outcomes.size() eq 0 or businessLayer.ticket eq null}"
                     onclick="PF('faxBackDialog').show()"
                     actionListener="#{businessLayer.splund('submitting faxback pa')}"
                     type="button"/>
                <!-- onstart="PF('loadingResults').show()"
                     onerror="PF('errorDialog').show()"
                     oncomplete="PF('loadingResults').hide(); PF('faxBackDialog').show()"/>-->
  </c:when>
  <c:otherwise>
    <p:commandButton value="Submit PA"
                     disabled="#{outcomes.size() eq 0 or businessLayer.ticket eq null}"
                     onstart="PF('loadingResults').show()"
                     onerror="PF('errorDialog').show()"
                     oncomplete="PF('loadingResults').hide()"
                     actionListener="#{businessLayer.splund('submitting regular pa')}"/>
  </c:otherwise>
</c:choose>

其中一个对话框:

<p:dialog widgetVar="refInfoDialog"
          id="refInfoDialog"
          closable="true"
          draggable="false"
          resizable="false"
          showHeader="true">
  <h:outputLabel for="refInfoInput" value="Ticket ID"/>
  <h:inputText id="refInfoInput"/>
  <p:commandButton value="OK"
                   onstart="PF('loadingResults').show()"
                   onerror="PF('errorDialog').show()"
                   oncomplete="PF('loadingResults').hide(); PF('refInfoDialog').hide(); _SUBMIT_REF_INFO()"/>
  <p:commandButton value="Cancel"
                   onstart="PF('loadingResults').show()"
                   onerror="PF('errorDialog').show()"
                   oncomplete="PF('loadingResults').hide(); PF('refInfoDialog').hide()"/>
</p:dialog>

#{businessLayer.splund(...)}是后端的日志记录功能,用于调试目的,对话框的定义与按钮的表单元素相同。

loadingResultserrorDialog对话框应按照预期显示,但我无法显示refInfoDialogfaxBackDialog完全没有。我已尝试将PF('<dialog_name>').show()放入各种onclick=""oncomplete=""actionListener=""onstart="",但它并未导致其中任何一个出现在单击它们各自的按钮。

更新:

事实证明onclick事件正常,但由于某种原因,对话框显示在其他div后面,因为它在父div之外。 JSF不是很棒吗? /讽刺

1 个答案:

答案 0 :(得分:0)

原来,如果你想要一个对话框出现,无论页面上的某个按钮是什么,它都需要包含在其他所有内容之后,否则它将被限制在它出现的div的框架内。 / p>

但是,这种做法打败了能够将页面分成多个子页面进行开发的整个想法。