【问题标题】:reRender rich:tabPanel without losing datareRender rich:tabPanel 不丢失数据
【发布时间】: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。

首先,用户在&lt;rich:calendar&gt; 组件中选择一个日期,然后在&lt;h:selectOneMenu&gt; 中选择一个值。之后,所需的行为(我想要实现的)是重新渲染 tabPanel 而不会丢失已经引入的数据。因此,我希望标签 SUBTAB1SUBTAB2 根据在​​ &lt;h:selectOneMenu&gt; 中选择的值而呈现。

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

如何在不丢失已经引入的数据的情况下呈现这些选项卡?我试图重新渲染特定的选项卡,但它不会使它们变得渲染(我想它只会影响它们的内容)。

提前谢谢你。

注意:所有涉及的 bean 都是 Session 范围的。

【问题讨论】:

  • 我两天前提交了一个类似的问题。我删除它是因为我认为问题是由于设计错误造成的,但事实并非如此。很抱歉删除了这个问题。
  • 看起来您有一个请求范围的托管 bean 来执行任务。您可以将其更改为会话范围或将其保留在请求范围内并将@KeepAlive 标记注释分配给您的托管 bean 类:@KeepAlive public class MyBean{ ... }

标签: java jsf richfaces jsf-1.2 ajax4jsf


【解决方案1】:

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

ajaxSingle

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

【讨论】:

  • 感谢您的回复,它让我明白了我的表单实际上是如何工作的。从我的a4j:support 中删除ajaxSingle=true 已经解决了问题,但是现在这些字段无法验证它们是否没有正确填写,所以rich:tabPanel 不会重新渲染。是否可以跳过验证但保留值?我只想在用户按下“插入”按钮时执行它们。
  • @jimrodrigg 无法将无效值设置到模型中。如果需要在 selectOneMenu 上更改某些内容,则只处理必须有效才能执行操作的字段。在你的情况下,我相信 a4j:support 可以获得 process="calendarId, selectOneMenuId"。
  • 其实整个表格都需要处理 =) 非常感谢您的澄清。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-05
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多