对话框内的Primefaces覆盖面板仅在身体上附加一次

时间:2015-03-16 14:22:47

标签: jsf primefaces

我有一个覆盖面板,用于选择输入文本的值。 如果覆盖面板附加到正文,则会正确显示并覆盖对话框。但在这种情况下,覆盖面板内的ajax列表器只会被触发一次。第二次(以及所有其他时间)不从侦听器执行辅助bean方法。 当我将appendToBody更改为false时,覆盖面板内的ajax侦听器每次都会触发,但覆盖面板不会显示在对话框的边框上。这有解决方案吗?试图使用z-index而没有成功。

编辑: 使用以下覆盖面板代码,它可以工作:     

<!-- if overlay is appended to body, it works only once -->
<p:overlayPanel widgetVar="#{widgetVar}" appendToBody="false" styleClass="clSelectionPanel" dynamic="true">

    <p:tree value="#{clContentController.getClRoot()}" var="element"
        selectionMode="single" draggable="false" droppable="false" dynamic="true">

        <p:ajax event="select" onstart="PF('#{widgetVar}').hide();" oncomplete="hitlistTableResized();"
            listener="#{clContentController.ok(element)}" immediate="true" update="@(.#{updateClass})" />

        <p:treeNode ...
    </p:tree>
</p:overlayPanel>

在带有按钮的输入文本上添加值和清除值:

    <p:inputText value="#{curProperty.value}" readonly="true"
    required="#{curExtendedEntryField.required}" styleClass="editMaskChoiceInput">
</p:inputText>
<p:commandButton immediate="true"
    actionListener="#{clController.setSelectedObject(curProperty)}"
    oncomplete="PF('clSelectionPanelEditVar').loadContents('#{component.clientId}');"
    title="Add Value" process="@this" />
<p:commandButton immediate="true"
    actionListener="#{editPropertyBL.clearCSelection(curProperty)}" 
     title="Clear Value" update="@(.editMaskChoiceInput)" />

我的案例中的诀窍是包含覆盖面板。我之前在输入文本字段迭代中完成了这个,但现在我在表单下定义它:

<h:form id="editPropertyFormId">
<ui:include src="/sections/dialog/editPropertyDialog.xhtml" />

<ui:include src="/sections/dialog/clSelectOverlay.xhtml">
    <ui:param name="widgetVar" value="clSelectionPanelEditVar" />
    <ui:param name="updateClass" value="editMaskChoiceInput" />
</ui:include>

此致 奥利弗

1 个答案:

答案 0 :(得分:0)

以下代码适合我。包括您正在使用的代码和JSF / Primefaces版本。

         <p:dialog closable="true"
                  visible="true">
            <h:form>
                <p:inputText id="inputtext">

                </p:inputText>
                <p:overlayPanel for="inputtext">
                    <p:commandButton value="Click to test">
                        <p:ajax oncomplete="alert('test');"/>
                    </p:commandButton>
                    Overlay content
                </p:overlayPanel>
            </h:form>
        </p:dialog>`