Вопрос по richfaces, ajax, forms, jsf-2 – Как перерисовать часть страницы с формой в JSF 2.0?

6

В настоящее время мы пытаемся перейти на JSF 2.0 с JSF 1.2, и одна из проблем, с которой мы столкнулись, состоит в том, что невозможно перерисовать часть страницы, которая содержит форму. Как этоouterDiv или формирует себя)

<code><h:panelGroup id="outerDiv">
    <h:form id="form1">...</h:form>
    <h:form id="form2">...</h:form>
</h:panelGroup>
</code>

Я имею в виду, что если я обновлюouterDiv все обновляется, но сама форма (или формы) становится неработоспособной и ведет себя странно, по крайней мере, вызовы ajax либо не работают при первом запуске, либо вместо вызова метода какого-либо компонента, они создают новый экземпляр этого компонента и ничего не делают ( либо уничтожением предыдущего при каждом вызове, либо просто созданием нового при первом вызове, а затем ничего не делать). Проблема может быть решена путем перерисовки только компонентов внутри формы, как это (обновлениеinnerDiv1 а такжеinnerDiv2):

<code><h:panelGroup id="outerDiv">
   <h:form id="form1">
       <h:panelGroup id="innerDiv1">...</h:panelGroup>
   </h:form>
   <h:form id="form2">
       <h:panelGroup id="innerDiv2">...</h:panelGroup>
   </h:form>
</h:panelGroup>
</code>

но у нас есть много мест, где мы включаем некоторые страницы сui:include и не очень удобно заглядывать внутрь этой страницы и обновлять там определенные компоненты. Кроме того, нам придется изменить все эти страницы, так как многие из них не имеют общих оболочек div внутри форм, и обновление каждого компонента в отдельности будет очень громоздким и подверженным ошибкам.
Итак, возможно ли заставить JSF 2.0 корректно обновлять часть страницы с помощью 1-го подхода, как это было в JSF 1.2?

РЕДАКТИРОВАТЬ: похоже, проблема с рендерингом формы является проблема richfaces 4.2, как я используюa4j:ajax (преемникa4j:support который был использован с richfaces 3.3.3) и пользовательских кнопок на основеrich:commandButton, Когда я заменил их на нативные jsff:ajax формы, кажется, обновлены правильно. Но проблема с внешним div все еще актуальна

Ваш Ответ

1   ответ
5

Это связано с частичным сохранением состояния. Если вы обновите ajax-компонент, который, в свою очередь, содержит форму в качестве одного из его дочерних элементов, его состояние просмотра будет потеряно. Каждый 1-й запрос Ajax внутри этой формы завершится сбоем, потому что нет состояния просмотра. Но если этот ajax-запрос перерисовывает саму форму, он будет работать.

Чтобы это исправить, нужноexplicitly включите ID другой формы в ajaxrender/update атрибут рядом сouterDiv всякий раз, когда он вызывается изanother форма.

Например.

<h:form>
    <h:commandButton value="Update other forms">
        <f:ajax render="outerDiv form1 form2" />
    </h:commandButton>
</h:form>
<h:panelGroup id="outerDiv">
    <h:form id="form1">...</h:form>
    <h:form id="form2">...</h:form>
</h:panelGroup>

Нет, это не приведет к ответу Ajax с дублирующимися компонентами. Он просто запустит JSF для подготовки и сохранения состояния этих других форм.

See also:

Это будет исправлено в JSF 2.2. Смотрите также выпуск 790.
Но в этом случае, я полагаю, мне вообще не нужно перерисовывать externalDiv, если он не содержит никакой информации за пределами форм. Проблема в том, что я сказал, что эти формы во многих случаях находятся в других файлах, поэтому мне всегда нужно проверять, какой интерфейс: include содержит какую форму. Это не очень удобно: в JSF 1.2 я могу перерисовать только внешний div, который находится на той же странице. Это ошибка JSF 2 или функция? :) Я имею в виду, будет ли это когда-нибудь исправлено, или я просто должен принять это? mykola

Похожие вопросы