Suporte de reprodução JSF com selectBooleancheckBox
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 && 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?
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 && 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