Поддержка JSF ReRender с помощью selectBooleanCheckbox

У меня есть страница JSF, на которой я хочу иметь флажок, который при нажатии будет добавлять/удалять некоторые другие поля формы со страницы. Вот (упрощенный) код, который у меня сейчас есть для флажка:

<h:selectBooleanCheckbox title="showComponentToReRender" value="#{backingBean.showComponentToReRender}">
    <a4j:support event="onsubmit" reRender="componentToReRender" />
</h:selectBooleanCheckbox>

Вот код компонента, который я хочу скрыть:

<h:selectOneMenu id="componentToReRender" value="#{backingBean.value}" rendered="#{valuesList.rowCount>1 &amp;&amp; backingBean.showComponentToReRender}">
   <s:selectItems value="#{valuesList}" var="value"/>
</h:selectOneMenu>

В настоящее время установка флажка ничего не дает; что "selectOneMenu" не исчезнет. Что я делаю неправильно?


person iandisme    schedule 08.01.2010    source источник


Ответы (2)


Вам нужно обернуть componentToReRender либо:

<h:panelGroup id="componentToReRenderWrapper">

or

<a4j:outputPanel id="componentToReRenderWrapper">

Итак, эффективно у вас будет:

<h:panelGroup id="componentToReRenderWrapper">
    <h:selectOneMenu id="componentToReRender" value="#{backingBean.value}" rendered="#{valuesList.rowCount>1 &amp;&amp; backingBean.showComponentToReRender}">
       <s:selectItems value="#{valuesList}" var="value"/>
    </h:selectOneMenu>
</h:panelGroup>

и измените reRender="componentToReRenderWrapper", если вы используете panelGroup, или удалите этот атрибут, если вы используете outputPanel.

Точное объяснение найдено в RichFaces. документы:

Наиболее распространенная проблема с использованием reRender — указание на компонент с атрибутом «рендеринг». Обратите внимание, что JSF не отмечает место в DOM браузера, куда следует поместить результат работы компонента, если условие «рендеринга» возвращает false. Поэтому после того, как компонент отрендерится во время Ajax-запроса, RichFaces доставляет отрендеренный код клиенту, но не обновляет страницу, потому что место для обновления неизвестно. Вам нужно указать на один из родительских компонентов, у которого нет атрибута «рендеринга». В качестве альтернативы вы можете обернуть компонент layout="none" .

person Bozho    schedule 08.01.2010
comment
кажется, что это действительно так, но рендеринг немного сложен. Я обновил свой ответ деталями из документов - person Bozho; 09.01.2010
comment
Интересно... Попробую в понедельник утром. - person iandisme; 10.01.2010
comment
Оборачивание компонентов для повторного рендеринга в h:panelGroup работало так, как вы ожидали. Единственная проблема, с которой я столкнулся сейчас, заключается в том, что поля появляются/исчезают через несколько секунд, и я не уверен, как сообщить пользователю, что его изменение затронуто. Спасибо!! - person iandisme; 11.01.2010

Не забудьте установить ajaxRendered="true" в a4j:outputPanel.

person janner    schedule 19.08.2010