Ajax,条件渲染和后台bean

时间:2011-07-25 15:33:34

标签: ajax jsf-2

我正在尝试显示一个页面,用户可以通过使用单选按钮进行适当选择来查看文本框或组合框。这相对简单,我设法通过以下代码完成:

<h:selectOneRadio id="selection" value="#{inputMethod.choice}">
  <f:selectItem itemValue="#{inputMethod.TEXT}" itemLabel="textbox"/>
  <f:selectItem itemValue="#{inputMethod.COMBO}" itemLabel="combobox" />
  <f:ajax event="click" execute="@this" render="@form" />
 </h:selectOneRadio>
<h:panelGroup id="Textbox" rendered="#{inputMethod.choice==inputMethod.TEXT}">
  <h:outputLabel>Textbox:</h:outputLabel>
  <h:inputText value="#{myBean.somevalue}" />
</h:panelGroup>
<h:panelGroup id="Combobox" rendered="#{inputMethod.choice==inputMethod.COMBO}"> 
  <h:outputLabel Combobox:/>
  <h:selectManyListbox id="CommunityListbox" value="#{myBean.choices}">
    <f:selectItems value="#{myBean.selections}" var="u" itemValue="#{u.id}" itemLabel="#{u.name}"/>
   </h:selectManyListbox>
 </h:panelGroup>

我遇到的问题是从不调用组合框的setter。 实际上,只为默认呈现的组件调用setter(在这种情况下只需inputMethod.choice==inputMethod.TEXT)。如果我删除条件渲染,则会按照预期调用所有setter。

非常感谢任何想法或答案!

PS:我使用的是jsf2.0,Glassfish 3.1,Netbeans 7.0(如果这是重要的话)

1 个答案:

答案 0 :(得分:1)

在处理表单提交请求期间,您需要确保#{inputMethod.choice}评估完全相同,就像在显示表单请求期间一样。最简单的方法是将bean放在视图范围内,或者将初始化逻辑移动到请求范围bean的(post)构造函数中。