Вопрос

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

Это было полезно?

Решение

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top