JSF PrimeFaces overlayPanel 提交值

Posted

技术标签:

【中文标题】JSF PrimeFaces overlayPanel 提交值【英文标题】:JSF PrimeFaces overlayPanel submit value 【发布时间】:2013-05-29 01:52:36 【问题描述】:

我想从 overlayPanel 向 bean 提交值表单 jsf 页面,并带有如下复选框:

为了显示覆盖面板和 ajax 提交,我使用了这段代码,并在调试器中看到它没问题:

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

但是当overlayPanel被隐藏并使用此代码按下表单提交按钮之后:

<p:commandButton value="Apply join" update="joinAccordionPanel,dsAccordionPanelMain" actionListener="#treeBean.applyJoinOptions" />
它再次将“false”设置为 bean 布尔值。

那么如何正确提交overlayPanel值给bean呢?

PrimeFaces 版本:3.5

【问题讨论】:

it sets "false" to bean boolean value again. 是什么意思?布尔值在任何时候都是 true 还是非原始 Boolean 首先,通过勾选复选框上的 ajax 事件将 bean 布尔值设置为“true”,但之后按下“提交”按钮以传输更多表单数据 - 它尝试将“false”设置为bean 布尔变量。 可以发一下treeBean.applyJoinOptions的代码吗? 这里没什么有趣的,只是迭代包含布尔值的 POJO 列表。 【参考方案1】:

我在这里找到了解释:http://forum.primefaces.org/viewtopic.php?f=3&t=30550#p97737:

"如果您使用 appendToBody,强烈建议您在 overlayPanel 组件中使用一个表单来包装所有输入字段和按钮。这是您在上一个解决方案中所做的。但是,这意味着您不能放置由于嵌套表单的限制,xhtml 页面中另一个表单内的 overlayPanel。最好的解决方案通常是在不是绝对必要的地方避免 appendToBody。"

编辑

我在 overlayPanel 中添加了&lt;h:form&gt;,现在可以正常工作了:

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

【讨论】:

以上是关于JSF PrimeFaces overlayPanel 提交值的主要内容,如果未能解决你的问题,请参考以下文章

JSF 页面元素无法从具有动作属性的支持 bean 触发方法。(JSF2.0 + primefaces)

与 primefaces 集成时无法加载 jsf.page

JSF + PrimeFaces:`update` 属性不更新组件

JSF 2.0 无法从 primefaces 呈现对话框

在 JSF 中使用 Primefaces 和 Bootstrap

使用 JSF 2.0 和 Primefaces 设置项目