2015-05-13 2 views
1

У меня есть проблемы с преобразованием этого кода из JSF 1.2 приложения эквивалента в JSF 2.x приложенияJsf RichFaces a4j: поддержка миграция в a4j: Аякс

<h:selectOneMenu id="type" value="#{bean.type}"> 
    <f:selectItems value="#{bean.typeList}"/> 
    <a4j:support event="onchange" 
       ajaxSingle="false" 
       immediate="true" 
       reRender="myForm"> 
     <a4j:actionparam name="type" 
         value="this.value" 
         assignTo="#{bean.type}" 
         noEscape="true"/> 
    </a4j:support> 
</h:selectOneMenu> 

Как это фрагмент коды работает.

В зависимости от выбранного значения в #{bean.type}, на моей странице отображаются разные поля. При изменении пользователем поля "type" вся форма повторно просматривается, но без проверки формы (ajaxSingle="false", immediate="true", reRender="myForm").

Я не хочу, чтобы проверить filds здесь, я просто хочу установить новое значение на #{bean.type} и переписать страницу, чтобы показать разные поля (в зависимости от #{bean.type}). Thats why i need to manualy #{bean.type} внутри a4j:actionparam.

Приятная особенность этого кода заключается в том, что отправленные значения в других файлах сохраняются после рендеринга.

Я пытаюсь сделать то же самое в JSF 2.x без успеха:

<h:selectOneMenu iid="type" value="#{bean.type}"> 
    <f:selectItems value="#{bean.typeList}"/> 
    <a4j:ajax event="valueChange" render="@form" execute="@this"/> 
</h:selectOneMenu> 

Это:

<a4j:ajax event="valueChange" render="@form" execute="@this"/> 

будет засавить всю форму и я потеряю занесено значение формы прочие поля

Этот:

<a4j:ajax event="valueChange" render="@form" execute="@form"/> 

представит, проверять и повторно вызывать вся форма (я хочу просто представить без проверки, как в JSF 1,2)

Это:

<a4j:ajax event="valueChange" render="@form" execute="@form" immediate="true"/> 

также не работает (работа же, как описано выше)

Итак, мой вопрос: как я могу добиться такого же поведения в JSF 2.x?

Благодарности

+0

Поскольку у вас есть поля в форме, которую вы не хотите переизбывать, почему вы в первую очередь редерируете всю форму? – Makhiel

+0

Makhiel Я хочу переписать всю форму, чтобы показать разные поля в зависимости от выбранного значения в поле типа. Некоторые файлы отображаются всегда, а некоторые - только для специальных типов (очень динамичные). И я хочу сохранить любые значения, введенные пользователем в любом поле, которое все еще отображается после реинжиниринга. – bary

+0

Ну, рендеринг просто заменяет элементы, поэтому, если вы не сохраните значения локально, они будут потеряны. Разве это не будет лучше решено полностью на стороне клиента, скрывая/показывая поля с JavaScript? – Makhiel

ответ

0

Спасибо Андрею комментарий Я нашел решение:

<h:selectOneMenu id="type" 
       value="#{bean.type}" 
       valueChangeListener="#{bean.typeChangeListener}" 
       immediate="true"> 
    <f:selectItems value="#{bean.typeList}"/> 
    <a4j:ajax execute="@form" render="@form" listener="#{facesContext.renderResponse}" immediate="true"/> 
</h:selectOneMenu> 

и:

public void typeChangeListener(ValueChangeEvent event) { 
    type = (String) event.getNewValue(); 
} 

немедленную a4j: Ajax вызывает то, что слушатель = "# {} facesContext.renderResponse" вызывается во время фазы запроса запроса, а renderResponse пропускает проверку.

немедленный on h: selectOneMenu вызывает, что valueChangeListener также вызывается во время фазы запроса запроса.

Таким образом, я могу представить всю форму без проверки, установить тип, переписать новые поля на основе измененного типа и сохранить отправленные значения в других файлах.

Смежные вопросы