JSF PrimeFaces OverlyPanel提交值

JSF PrimeFaces OverlyPanel提交值,jsf,primefaces,Jsf,Primefaces,我想使用如下复选框从OverlyPanel向bean提交值表单jsf页面: 为了显示覆盖面板和ajax提交,我使用以下代码,并在调试器中看到它是OK的: <p:commandButton id="joinBtn" value="Basic" type="button" disabled="#{dataPropertyCurrent.notJoinable}"/> <p:overlayPanel id="joinPanel" for="joinBtn" appendToBody

我想使用如下复选框从OverlyPanel向bean提交值表单jsf页面:

为了显示覆盖面板和ajax提交,我使用以下代码,并在调试器中看到它是OK的:

<p:commandButton id="joinBtn" value="Basic" type="button" disabled="#{dataPropertyCurrent.notJoinable}"/>
<p:overlayPanel id="joinPanel" for="joinBtn" appendToBody="true" dynamic="false">
    <f:facet name="header">Details</f:facet>
    <p:dataList value="#{treeBean.getDataPropsCouldBeJoinedWith(dataPropertyCurrent)}" type="definition" var="dataJoinVal">
        <h:panelGrid columns="2" cellpadding="10">
            <h:column>
                <p:selectBooleanCheckbox value="#{dataJoinVal.checked}" id="cbID">
                    <p:ajax event="change" update="cbID" partialSubmit="true"/>
                </p:selectBooleanCheckbox>
            </h:column>
            <h:column>
                <h:outputText value="#{dataJoinVal.caption}" />
            </h:column>
        </h:panelGrid>
    </p:dataList>
    <!--<p:commandButton  value="Apply" id="btnApplyJoin" type="button" process="@parent" />-->
    <h:outputLabel value="ID: #{dataPropertyCurrent.joinDataPropertyId}" />
</p:overlayPanel>

细节
但在它之后,当覆盖面板被隐藏并且表单提交按钮被按下时,使用以下代码:

<p:commandButton value="Apply join" update="joinAccordionPanel,dsAccordionPanelMain" actionListener="#{treeBean.applyJoinOptions}" />

  • 它再次将“false”设置为bean布尔值
那么,如何正确地向bean提交overlypanel值呢


PrimeFaces版本:3.5

我在这里找到了解释:

“如果您使用的是appendToBody,强烈建议在OverlyPanel组件中包含一个表单,用于包装所有输入字段和按钮。这就是您在上一个解决方案中所做的。但是,这意味着您不能将OverlyPanel放在xhtml页面中的另一个表单中,因为嵌套表单受到限制。最好的解决方案通常是在并非绝对必要的地方避免附加到身体上。”

编辑

我在OverlyPanel中添加了
,现在它可以正常工作了:

<p:overlayPanel id="joinPanel" for="joinBtn" appendToBody="true" dynamic="true" >
    <h:form id="formTmp">
    <f:facet name="header">Details</f:facet>
    <p:dataList value="#{treeBean.getDataPropsCouldBeJoinedWith(dataPropertyCurrent)}" type="definition" var="dataJoinVal">
        <h:panelGrid columns="2" cellpadding="10">
            <h:column>
                <p:selectBooleanCheckbox value="#{dataJoinVal.checked}" id="cbID">
                    <p:ajax event="change" update="cbID" partialSubmit="true"/>
                </p:selectBooleanCheckbox>
            </h:column>
            <h:column>
                <h:outputText value="#{dataJoinVal.caption}" />
            </h:column>
        </h:panelGrid>
    </p:dataList>
    </h:form>
</p:overlayPanel>

细节

我在这里找到了解释:

“如果您使用的是appendToBody,强烈建议在OverlyPanel组件中包含一个表单,用于包装所有输入字段和按钮。这就是您在上一个解决方案中所做的。但是,这意味着您不能将OverlyPanel放在xhtml页面中的另一个表单中,因为嵌套表单受到限制。最好的解决方案通常是在并非绝对必要的地方避免附加到身体上。”

编辑

我在OverlyPanel中添加了
,现在它可以正常工作了:

<p:overlayPanel id="joinPanel" for="joinBtn" appendToBody="true" dynamic="true" >
    <h:form id="formTmp">
    <f:facet name="header">Details</f:facet>
    <p:dataList value="#{treeBean.getDataPropsCouldBeJoinedWith(dataPropertyCurrent)}" type="definition" var="dataJoinVal">
        <h:panelGrid columns="2" cellpadding="10">
            <h:column>
                <p:selectBooleanCheckbox value="#{dataJoinVal.checked}" id="cbID">
                    <p:ajax event="change" update="cbID" partialSubmit="true"/>
                </p:selectBooleanCheckbox>
            </h:column>
            <h:column>
                <h:outputText value="#{dataJoinVal.caption}" />
            </h:column>
        </h:panelGrid>
    </p:dataList>
    </h:form>
</p:overlayPanel>

细节

你所说的
是什么意思?它再次将“false”设置为bean布尔值。
布尔值在任何时候都是真的还是非原语
布尔值
?首先,通过勾选复选框上的ajax事件将bean布尔值设置为“true”,但之后是“提交”按下按钮以传输更多表单数据-它试图将“false”设置为bean布尔值。您可以发布
treeBean.applyJoinOptions
的代码吗?这里没有什么有趣的,只是迭代包含布尔值的POJO列表。您所说的
是什么意思?它再次将“false”设置为bean布尔值。
?布尔值在任何时候都是真的还是非原语的
布尔值
?首先,通过勾选复选框上的ajax事件将bean布尔值设置为“真”,但在“提交”之后按下按钮传输更多表单数据-它试图将bean布尔变量设置为“false”。您可以发布
treeBean.applyJoinOptions
的代码吗?这里没有什么有趣的,只是迭代包含布尔VAL的POJO列表。