2010-01-08 4 views
3

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

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

ответ

9

Вам нужно обернуть 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 документы:

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

+0

кажется, что это делает на самом деле, но визуализация немного сложнее. Я обновил свой ответ с подробной информацией из документов. – Bozho

+0

Интересно ... Я попробую это в понедельник утром. – iandisme

+0

Обертывание компонентов, которые нужно переписать в группе h: panelGroup, работала так, как вы ожидали. Единственная проблема, с которой я столкнулся сейчас, это то, что ящики занимают несколько секунд, чтобы появиться/исчезнуть, и я не уверен, как сообщить пользователю об изменении их изменений. Благодаря!! – iandisme

2

Не забудьте установить ajaxRendered = «истина» на a4j: outputPanel