我正在尝试显示一个页面,用户可以通过使用单选按钮进行适当选择来查看文本框或组合框。这相对简单,我设法通过以下代码完成:
<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(如果这是重要的话)
答案 0 :(得分:1)
在处理表单提交请求期间,您需要确保#{inputMethod.choice}
评估完全相同,就像在显示表单请求期间一样。最简单的方法是将bean放在视图范围内,或者将初始化逻辑移动到请求范围bean的(post)构造函数中。