2013-03-13 79 views
0

使用JSF 1.2和3.3 RichFaces的,我有这样的形式:重新呈现丰富:一个tabpanel而不会丢失数据

<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进行reRender。因此,我预计标签SUBTAB1SUBTAB2将根据在<h:selectOneMenu>中选择的值而呈现。

我得到了什么:tabPanel被重新渲染,合适的SUBTAB被渲染,但第一个选项卡中引入的数据丢失。

如何渲染这些选项卡而不会丢失已经引入的数据?我试着重新调整特定的标签,但不让它们呈现(我认为它只影响到它们的内容)。

预先感谢您。

注意:所涉及的所有bean都是会话作用域。

+0

两天前我提交了一个类似的问题。我删除了它,因为我认为这个问题是由于设计错误造成的,但事实并非如此。对不起,删除了这个问题。 – jmrodrigg 2013-03-13 16:29:12

+0

看起来您有一个请求作用域管理bean来执行任务。您可以将其更改为会话作用域或将其留在请求作用域,并将'@ KeepAlive'标记注释分配给托管的Bean类:'@KeepAlive public class MyBean {...}' – 2013-03-13 21:44:39

回答

1

问题是输入值不在服务器上处理。 从a4j:support中删除ajaxSingle="true",因此在selectOneMenu值更改时处理整个表单。您可以使用process属性来限制提交的区域(以防您不想处理整个表单)。

ajaxSingle

限制JSF树处理(解码,转换,验证和模型 更新)仅发送请求的组件。布尔。默认 值为“false”。

+0

感谢您的回应,它已澄清了如何我的表单实际上工作。从'a4j:support'中删除'ajaxSingle = true'已经解决了这个问题,但是现在这些字段无法验证它们是否没有被正确填充,所以'rich:tabPanel'不会被重新编译。是否有可能跳过验证,但保留值?我只是希望在用户按下“插入”按钮时执行它们。 – jmrodrigg 2013-03-14 09:37:29

+0

@jimrodrigg模型中无法设置无效值。如果selectOneMenu上的某些内容需要更改,则只能处理必须有效执行操作的字段。在你的情况下,我相信a4j:支持可以得到过程=“calendarId,selectOneMenuId”。 – Andrey 2013-03-14 17:20:23

+0

事实上,整个表单需要处理=)非常感谢您的澄清。 – jmrodrigg 2013-03-14 18:48:47

相关问题