Pergunta

Eu tenho uma página JSF na qual quero ter uma caixa de seleção que, quando clicada, adicionará/remove certos outros campos de formulário da página. Aqui está o código (simplificado) que tenho atualmente para a caixa de seleção:

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

Aqui está o código para o componente que quero esconder:

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

Atualmente, clicar na caixa de seleção não faz nada; que "selectOneMenu" não desaparecerá. O que estou fazendo errado?

Foi útil?

Solução

Você precisa embrulhar o componentToReRender em ambos:

<h:panelGroup id="componentToReRenderWrapper">

ou

<a4j:outputPanel id="componentToReRenderWrapper">

Então, efetivamente você terá:

<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>

e mude o reRender="componentToReRenderWrapper" Caso você use panelGroup, ou remova esse atributo, caso você use outputPanel.

Encontrou a explicação exata no Richfaces documentos:

O problema mais comum com o uso de reprodução está apontando para o componente que possui um atributo "renderizado". Observe que o JSF não marca o local no navegador DOM, onde o resultado do componente deve ser colocado caso a condição "renderizada" retorne falsa. Portanto, depois que o componente é renderizado durante a solicitação do Ajax, o RichFaces fornece o código renderizado ao cliente, mas não atualiza uma página, porque o local para atualização é desconhecido. Você precisa apontar para um dos componentes pais que não possui atributo "renderizado". Como alternativa, você pode envolver o componente com layout = "nenhum".

Outras dicas

Não se esqueça de definir ajaxrenderd = "true" no A4J: OUTPUTPANEL

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top