2013-03-13 4 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 без потери уже введенных данных. Следовательно, я ожидаю, что вкладки SUBTAB1 или SUBTAB2 станут отображаться в зависимости от того, какое значение выбрано в <h:selectOneMenu>.

То, что я получаю: TabPanel перерисовывается, обрабатывается соответствующий SUBTAB, но данные, введенные на первой вкладке, теряются.

Как я могу визуализировать эти вкладки, не теряя уже введенные данные? Я попытался переписать определенные вкладки, но не стал их визуализировать (я полагаю, это влияет только на их содержимое).

Заранее спасибо.

Примечание. Все задействованные бобовые являются сессионными.

+0

Я представил аналогичный вопрос два дня назад. Я удалил его, потому что думал, что проблема связана с ошибками дизайна, но это не так. Извините за удаление вопроса. – jmrodrigg

+0

Похоже, у вас есть запрос с управляемым bean-компонентом для выполнения задачи. Вы можете изменить его на сеанс или оставьте его по запросу и назначьте аннотацию тега @ @ KeepAlive для вашего управляемого компонента bean-класса: '@KeepAlive public class MyBean {...}' –

ответ

1

Проблема в том, что значения входов не обрабатываются на сервере. Удалить ajaxSingle="true" от a4j:support, поэтому вся форма обрабатывается при изменении значения selectOneMenu. Вы можете использовать атрибут process, чтобы ограничить область отправки (в случае, если вы не хотите обрабатывать всю форму).

ajaxSingle

Пределы JSF обработки дерева (декодирование, преобразование, проверка и модель обновление) только к компоненту, который посылает запрос. Boolean. Значение по умолчанию Значение «false».

+0

Спасибо за ваш ответ. Он разъяснил мне, как моя форма действительно работала. Удаление 'ajaxSingle = true' из моей' a4j: support' решило проблему, но теперь поля не проверяются, если они не заполнены должным образом, поэтому 'rich: tabPanel' не перерисовывается. Можно ли пропустить проверки, но сохранить значения? Я просто хочу, чтобы они выполнялись, когда пользователь нажимает кнопку «Вставить». – jmrodrigg

+0

@jimrodrigg Недействительные значения не могут быть установлены в модель. Если что-то нужно изменить на selectOneMenu, сделайте процесс только полями, которые должны быть действительными для выполнения операции. В вашем случае я верю a4j: поддержка может получить process = "calendarId, selectOneMenuId". – Andrey

+0

Фактически, вся форма должна быть обработана =) Большое спасибо за ваши разъяснения. – jmrodrigg