使用jsf 2和Primefaces 3.4
我知道有许多类似的问题,但没有一个能在这个问题上发挥作用。
当panelGrid“inner”以固定值“true”(<h:panelGrid id="inner" rendered="true">
)呈现时
=&GT;单击命令按钮后,输入组件正确更新#{tableMatchesBean.mergedAuthorAjax}的值,
但是当此面板的呈现有条件时:<h:panelGrid rendered="#{spellCheckBean.renderInputMerge}">
=&GT;然后输入组件是无声(没有跟踪tableMatchesBean.mergedAuthorAjax已被调用)。
注意:我使用嵌套的panelGrids将渲染条件放在需要有条件渲染的组件的父元素(输出和输入组件)中。任何帮助表示赞赏。
评论后编辑:] xhtml页面的作用:
- 当用户单击selectOnebutton中的“merge”选项时,ajax更新会将“renderInputMerge”切换为true,从而导致显示“外部”组件。它工作正常。在此组件中,有一个输入字段,显示确定
- 在用户单击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>
答案 0 :(得分:5)
您的rendered
条件显然取决于请求范围变量,例如请求范围的托管bean或请求参数的属性。表单提交帐户作为完全独立且全新的请求,所有请求范围内的托管bean都是新重新创建的,所有属性都设置为默认值。如果rendered
属性在收集提交的值(表单提交的申请请求值阶段)期间评估为false
,则不会收集它们。
基本上有两种方法可以解决这个问题:
确保rendered
属性背后的条件在请求范围bean的(post)构造函数中正确预初始化,以便在处理表单提交请求期间返回完全相同的值它是在向最终用户显示表单的请求期间。
将bean放在视图范围内。这样,只要您通过ajax与同一视图交互或在操作方法中返回void
或null
,bean实例就会生效。
答案 1 :(得分:-3)
尝试使用jstl c:if
标记代替rendered
。这对我有用。