Поддержка JSF ReRender с помощью selectBooleanCheckbox - PullRequest
3 голосов
/ 08 января 2010

У меня есть страница 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" не исчезнет. Что я делаю не так?

Ответы [ 2 ]

10 голосов
/ 09 января 2010

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

<h:panelGroup id="componentToReRenderWrapper">

или

<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 браузера, где должен располагаться результат компонента в случае, если условие «render» возвращает false. Поэтому после того, как компонент будет обработан во время Ajax-запроса, RichFaces доставит обработанный код клиенту, но не обновит страницу, поскольку место для обновления неизвестно. Вам нужно указать на один из родительских компонентов, который не имеет атрибута «рендеринг». В качестве альтернативы вы можете обернуть компонент с layout = "none".

2 голосов
/ 19 августа 2010

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

...