Поддержка 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 && backingBean.showComponentToReRender}">
<s:selectItems value="#{valuesList}" var="value"/>
</h:selectOneMenu>
В настоящее время установка флажка ничего не дает;что «selectOneMenu» не исчезнет.Что я делаю не так?
Решение
Вам нужно обернуть componentToReRender
в любом:
<h:panelGroup id="componentToReRenderWrapper">
или
<a4j:outputPanel id="componentToReRenderWrapper">
Итак, эффективно вы получите:
<h:panelGroup id="componentToReRenderWrapper">
<h:selectOneMenu id="componentToReRender" value="#{backingBean.value}" rendered="#{valuesList.rowCount>1 && 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" .
Другие советы
Не забудьте установить ajaxRendered="true" в a4j:outputPanel.