Atualizar componente qdo o msm altera estado rendered=false para true no JSF 2.0? [RESOLVIDO]

9 respostas
L

Olá pessoal, boa tarde.
Estou tendo problemas ao efetuar atualização de componentes que não são renderizados na tela, e em certo momento o estado destes passam para
serem exibidos, porém os mesmos não são renderizados novamente.

Segue o exemplo abaixo: Possuo um Radio onde dependendo do tipo de pessoa, física ou jurídica, é exibido o seu respectivo painelGrid.

<h:outputLabel value="#{msg['cliente.tipoCliente']}" />
                    <h:selectOneRadio id="sorTipoCliente" required="true"
                                      requiredMessage="Tipo Cliente requerido"
                                      readonly="#{clienteController.somenteLeitura}"
                                      valueChangeListener="#{clienteController.recuperaClienteSelecionado}">
                        <f:selectItem itemLabel="Física" itemValue="0" />
                        <f:selectItem itemLabel="Jurídica" itemValue="1" />
                        <f:ajax event="change" render="pgrCpf pgrCnpj" />
                    </h:selectOneRadio>
                    <h:inputHidden />
                    <p:message for="sorTipoCliente" showDetail="true" showSummary="false" />


                    <h:panelGrid id="pgrCpf" columns="2" rendered="#{clienteController.exibeCpf}">
                        <h:outputLabel value="#{msg['cliente.cpf']}" />
                        <p:inputMask id="iptCpf" value="#{clienteController.clienteSelecionado.nuCpf}"
                                     required="true" mask="[CPF removido]" maxlength="11" size="14"
                                     onblur="if (!validarCPF(this)) {
                                                document.getElementById('form:iptCpf').focus();
                                           }"
                                     requiredMessage="#{msg['cliente.cpf.requerido']}"
                                     readonly="#{clienteController.somenteLeitura}" />
                        <h:inputHidden />
                        <h:message for="iptCpf" styleClass="fonteAlerta" showDetail="true" showSummary="false" />
                    </h:panelGrid>
                    <h:inputHidden />


                    <h:panelGrid id="pgrCnpj" columns="2" rendered="#{clienteController.exibeCnpj}">
                        <h:outputLabel value="#{msg['cliente.cnpj']}" />
                        <p:inputMask id="iptCnpj" value="#{clienteController.clienteSelecionado.nuCnpj}" size="19" maxlength="14"
                                     mask="99.999.999/9999-99" required="true" requiredMessage="#{msg['cliente.cnpj.requerido']}"
                                     readonly="#{clienteController.somenteLeitura}" />
                        <h:inputHidden />
                        <h:message for="iptCnpj" styleClass="fonteAlerta" showDetail="true" showSummary="false" />
                    </h:panelGrid>

Porém a tag <f:ajax não funciona ao executar um render no componente com o rendered=false, exibindo que o mesmo não foi encontrado no xhtml.
Já tentei utilizar a tag ><p:ajax event=“change” update=“pgrCpf pgrCnpj” />, neste caso não apresenta o mesmo erro do f:ajax, mas o componente
não é atualizado, exibindo este conforme opção selecionada no Radio.
Alguem tem alguma idéia de como resolver essa questão? Fica aí o desafio… Não encontrei nada parecido na net com componentes não renderizados.
Na versão 1.2 era simplesmente utilizar o <a4j:support era simples, sendo utilizado ><a4j:support event=“change” reRender=“idDoComponente” />
Abraços,
Atenciosamente,
Lessandro

9 Respostas

F

Tenta colocar um h:outputPanel id=“pgr” por fora e fazer reRender dele.

Abraço,

L

Olá amigo.
Como mencionei anteriormente não utilizo JSF 1.2, estou utilizando o 2.0 sem o RichFaces.
A tag reRender faz parte dos componentes do Richfaces. No momento estou utilizando o componente
PrimeFaces versão 2.0.2.
Abs,
Lessandro

L

Eh, complicado viu…
Ou ninguém está utilizando o jsf 2.0, ou está com ele e a versão 3.3.3 do Richfaces, não é possível que ninguém tenha
passado esse problema de atualização de componente após setar algo com rendered=false ou true…
:cry:

F

A idéia é colocar outro componente por fora e mandar renderiza-lo, independente da versão.

Flw

lessandronp:
Olá amigo.
Como mencionei anteriormente não utilizo JSF 1.2, estou utilizando o 2.0 sem o RichFaces.
A tag reRender faz parte dos componentes do Richfaces. No momento estou utilizando o componente
PrimeFaces versão 2.0.2.
Abs,
Lessandro

L

Olá amigo, boa tarde.
Então, eu já coloquei um componente por fora, no caso o PainelGrid. Dentro deste possuo os dados do cpf e cnpj respectivamente, um PainelGrid para cada um deles.
A tag <f:ajax process=“sorTipoCliente” event=“change” render=“pgrCpf pgrCnpj” /> não funciona quando no momento o componente está com o rendered=false,
pois o componente não é encontrado na página JSF para fazer a atualização do mesmo. Se eu utilizar a tag do primefaces <p:ajax> nem a tentativa de renderização é realizada, pois ao selecionar pessoa física ou jurídica ele não entra no setTipoCliente() quando eu utilizava a tag “value” do selectOneRadio, e ao utilizar a tag valueChangeListener="#{clienteController.recuperaClienteSelecionado"} ele não entra nesse método que espera um ActionEvent.
Abs,
Lessandro

F

O que você tentou fazer foi isso ???

<h:outputLabel value="#{msg['cliente.tipoCliente']}"  />  
<h:selectOneRadio id="sorTipoCliente" required="true"  
                  requiredMessage="Tipo Cliente requerido"  
                  readonly="#{clienteController.somenteLeitura}"  
                  valueChangeListener="#{clienteController.recuperaClienteSelecionado}">  
    <f:selectItem itemLabel="Física" itemValue="0" />  
    <f:selectItem itemLabel="Jurídica" itemValue="1" />  
    <f:ajax event="change" render="pgr" />  
</h:selectOneRadio>  
<h:inputHidden />  
<p:message for="sorTipoCliente" showDetail="true" showSummary="false" />  
  
<h:panelGrid id="pgr">
	<h:panelGrid id="pgrCpf" columns="2" rendered="#{clienteController.exibeCpf}">  
	    <h:outputLabel value="#{msg['cliente.cpf']}" />  
	    <p:inputMask id="iptCpf" value="#{clienteController.clienteSelecionado.nuCpf}"  
	                 required="true" mask="[CPF removido]" maxlength="11" size="14"  
	                 onblur="if (!validarCPF(this)) {  
	                            document.getElementById('form:iptCpf').focus();  
	                       }"  
	                 requiredMessage="#{msg['cliente.cpf.requerido']}"  
	                 readonly="#{clienteController.somenteLeitura}" />  
	    <h:inputHidden />  
	    <h:message for="iptCpf" styleClass="fonteAlerta" showDetail="true" showSummary="false" />  
	</h:panelGrid>  
	<h:inputHidden />  
	  
	  
	<h:panelGrid id="pgrCnpj" columns="2" rendered="#{clienteController.exibeCnpj}">  
	    <h:outputLabel value="#{msg['cliente.cnpj']}" />  
	    <p:inputMask id="iptCnpj" value="#{clienteController.clienteSelecionado.nuCnpj}" size="19" maxlength="14"  
	                 mask="99.999.999/9999-99" required="true" requiredMessage="#{msg['cliente.cnpj.requerido']}"  
	                 readonly="#{clienteController.somenteLeitura}" />  
	    <h:inputHidden />  
	    <h:message for="iptCnpj" styleClass="fonteAlerta" showDetail="true" showSummary="false" />  
	</h:panelGrid>  
</h:panelGrid>
L

Vou tentar aqui, mas creio que ficará no mesmo em tentar renderizar dois componentes ou 1 componente apenas…
Talvez a única diferença seja por causa do Rendered…
Abs,
Lessandro

L

É amigo, deu certo… Possuo um componente painelGrid principal <h:panelGrid id=“pgrCliente” columns=“2” rendered="#{clienteController.exibePainelGrid}"> que é exibido
ao ser chamado alguma ação como alterar, consultar, incluir, etc, o cliente Selecionado.
Coloquei o Id desse cara, que já foi renderizado como true ao ser chamado por essas ações e funcionou perfeitamente.
Obrigado pela ajuda e atenção,
Abraços,
Att,
Lessandro

E

Nossa, eu tava quase desistindo de usar a tag ajax e mandar ver no onchange=“submit()” e immediate=“true” pra cumprir o prazo do chefe. Quem diria que um simples <h:panelgrid> ia salvar a pátria.

Obrigado ao colega fre_d e a este Fórum.

Criado 25 de maio de 2010
Ultima resposta 19 de jan. de 2012
Respostas 9
Participantes 3