【发布时间】:2013-03-01 17:21:02
【问题描述】:
使用 JSF 1.2 和 Richfaces 3.3,我有这个表单:
<h:form>
<rich:tabPanel switchType="client" id="tabPnl">
<rich:tab label="MAIN_TAB">
<h:outputText value="#{msg.date}"/>
<rich:calendar value="#{MyBean.date}">
<f:validator validatorId="CalendarValidator" />
</rich:calendar>
<h:message for="DataInici" errorClass="error" />
<h:outputText value="#{msg.selector}"/>
<h:selectOneMenu id="select_val" value="#{MyBean.selectedItem}">
<f:selectItem itemLabel="#{msg.select_value}" itemValue="-1" />
<f:selectItems value="#{MyBean.listOfItems}" />
<f:validator validatorId="NumSelValidator" />
<a4j:support event="onchange" reRender="tabPnl" ajaxSingle="true" />
</h:selectOneMenu>
<h:message for="select_val" errorClass="error" />
</rich:tab>
<rich:tab label="SUBTAB1" id="subtab1" rendered="#{MyBean.selectedItem == 1}">
// form components such as inputText and/or SelectOneMenu.
</rich:tab>
<rich:tab label="SUBTAB2" id="subtab2" rendered="#{MyBean.selectedItem == 2}">
// Other form components such as inputText and/or SelectOneMenu.
</rich:tab>
</rich:tabPanel>
<h:commandButton value="#{msg.insert}" action="#{MyBean.insertData}">
</h:form>
一开始,SUBTAB1 和 SUBTAB2 没有被渲染,因为MyBean.selectedItem 的默认值是-1。
首先,用户在<rich:calendar> 组件中选择一个日期,然后在<h:selectOneMenu> 中选择一个值。之后,所需的行为(我想要实现的)是重新渲染 tabPanel 而不会丢失已经引入的数据。因此,我希望标签 SUBTAB1 或 SUBTAB2 根据在 <h:selectOneMenu> 中选择的值而呈现。
我得到了什么:tabPanel 被重新渲染,相应的 SUBTAB 被渲染,但在第一个选项卡中引入的数据丢失了。
如何在不丢失已经引入的数据的情况下呈现这些选项卡?我试图重新渲染特定的选项卡,但它不会使它们变得渲染(我想它只会影响它们的内容)。
提前谢谢你。
注意:所有涉及的 bean 都是 Session 范围的。
【问题讨论】:
-
我两天前提交了一个类似的问题。我删除它是因为我认为问题是由于设计错误造成的,但事实并非如此。很抱歉删除了这个问题。
-
看起来您有一个请求范围的托管 bean 来执行任务。您可以将其更改为会话范围或将其保留在请求范围内并将
@KeepAlive标记注释分配给您的托管 bean 类:@KeepAlive public class MyBean{ ... }
标签: java jsf richfaces jsf-1.2 ajax4jsf