4

使用 jsf 2 和 Primefaces 3.4

我知道有很多类似的问题,但没有一个可以解决这个问题。

当 panelGrid "inner" 以"true" ( <h:panelGrid id="inner" rendered="true">) => 的固定值呈现时,在单击命令按钮后,输入组件会正确更新#{tableMatchesBean.mergedAuthorAjax} 的值,

但是当这个面板的呈现是有条件的时:<h:panelGrid rendered="#{spellCheckBean.renderInputMerge}"> => 然后输入组件是静默的(没有跟踪 tableMatchesBean.mergedAuthorAjax 已被调用)。

注意:我使用嵌套的 panelGrids 将渲染条件放在需要条件渲染的组件(输出和输入组件)的父元素中。任何帮助表示赞赏。

[评论后编辑:] xhtml 页面的作用:
- 当用户单击 selectOnebutton 中的“合并”选项时,ajax 更新将“renderInputMerge”切换为 true,从而显示“外部”组件。它工作正常。在这个组件中,有一个输入字段,显示OK。
- 用户单击 commandLink 按钮后,我需要检索此输入字段的值。如上所述,我对此有疑问。

xhtml:

<h:body style ="width:100%">


    <h:form id = "currMatch">

        <h:panelGrid>

            <p:selectOneButton id ="selection" value="#{spellCheckBean.optionChosen}">
                <f:selectItem itemLabel="keep both" itemValue="1" />
                <f:selectItem itemLabel="delete both" itemValue="2" />
                <f:selectItem itemLabel="merge" itemValue="3" />
                <p:ajax update="outer" />
            </p:selectOneButton>

        </h:panelGrid>

         <h:panelGrid id="outer" >
            <h:panelGrid id="inner" rendered="#{spellCheckBean.renderInputMerge}">
            <!-- **the line above does not update**, this one does    <h:panelGrid rendered="true">-->

                <h:outputText value="our suggestion:  "  style ="margin-left: auto; margin-right: auto"/> 
                     <h:inputText id ="testinput" value="#{tableMatchesBean.mergedAuthorAjax}">
                     </h:inputText>
                </h:panelGrid>    
        </h:panelGrid>

        <p:commandButton action="#{tableMatchesBean.next_()}" 
                         title="Add"
                         value="next"
                         update ="currMatch"
                         >

        </p:commandButton>




    </h:form>
</h:body>

4

2 回答 2

5

您的rendered条件显然取决于请求范围的变量,例如请求范围的托管 bean 的属性或请求参数。表单提交帐户作为一个完全独立的全新请求,其中所有请求范围的托管 bean 都是新重新创建的,所有属性都设置为默认值。如果该rendered属性false在收集提交的值期间评估为(表单提交的应用请求值阶段),那么它们根本不会被收集。

基本上有两种方法可以解决这个问题:

  1. 确保rendered属性背后的条件在请求范围 bean 的 (post) 构造函数中正确预初始化,以便它在处理表单提交的请求期间返回与将表单显示到请求期间完全相同的值最终用户。

  2. 而是将 bean 放在视图范围内。这样,只要您通过 ajax 或通过 return voidor nullin action 方法与同一视图交互,bean 实例就会存在。

也可以看看:

于 2012-09-10T11:02:34.457 回答
-3

尝试 jstlc:if 标记代替rendered. 这对我行得通。

于 2015-09-25T10:56:33.637 回答