Pessoal estou tendo problemas para reRenderizar meus componentes.
Possuo dois formulários e alguns botões e de acordo com alguns cliques é exibido um ou outro, o mesmo acontece para os botões deste formulário.
Quando eu passo no reRender do meu botão ajax os ids dos componentes que eu quero renderizar novamente ele não faz o reRender.
Só está funcionando quando eu coloco os componentes dentro de um panelGroup e manda renderizar novamente o panelGroup.
pq isso?
Posta o código.
[]´s
Daniel
Provavelmente seu código está parecido com alguma coisa assim:
<a4j:commandButton value="" action="" rendered="#{controle.renderizar}"/>
<a4j:commandButton value="" action="" rendered="#{!controle.renderizar}"/>
Nesse código temos dois botões que nunca serão renderizados ao mesmo tempo. Quando é executada alguma requisição e vc quer dar reRender neles, vc precisa obrigatoriamente dar o reRender em um nível acima, como abaixo:
<a4j:outputPanel id="painelBotoes">
<a4j:commandButton value="" action="" rendered="#{controle.renderizar}"/>
<a4j:commandButton value="" action="" rendered="#{!controle.renderizar}"/>
<a4j:outputPanel>
Agora podemos dar o reRender no painel.
Isso deve acontecer pq quando vc da o reRender os gets ainda não foram chamados. Eu imagino que seja por isso. De qualquer maneira é até melhor assim pois vc renderiza um só componente, fica mais fácil a leitura do código.
O reRender só funciona em componentes que estão na tela. Você vai ter que deixar o componente invisível (disable e com valor ="", por exemplo), mas renderizado ou colocá-lo aninhado num outro que esteja renderizado como o panelGroup.
bom o motivo, rasao, circustancia para o rerender n funcionar da maneira q vc esperava eu tb desconheço
mas oq eu percebo no dia a dia é q c vc tentar chamar o rerender d um componente q pertence a um msmo componente pai, ele funciona sem problemas,
como mostra esse exemplo.
mas se vc precisar rerenderizar um componente q pertence a outro componente pai, vc tem q rerenderisar todo o componente pai..
mas se alguem puder dizer o pq …
Dica: você não pode brincar de exibir e esconder componente que possui atributo rendered dinâmico, sendo, re-renderize um componente pai (que engloba o componente que você quer exibir).
Por que?
Quando o response da requisição AJAX retorna o Richfaces tenta encontrar a posição do componente (aquele indicado pelo atributo reRender) na árvore DOM da página para efetuar a atualização parcial de página (ppr), mas o componente que ele está tentando atualizar não existe não árvore DOM (pois ele nem havia sido renderizado), logo o Richfaces não consegue encontrar a posição em que ele deve atualizar o componente.
É basicamente isso, espero que tenha sido claro, o sono não está me deixando pensar direito hoje
Imagine que você escreve um esboço de um texto qualquer dizendo que ele vai ter 4 parágrafos, mas quando vai escrever o texto de fato usa apenas 3. O que acontece quando você pede pra um amigo fazer uma revisão do 4º parágrafo?
Ou seja, o re-render é pra mudar os atributos do componente em questão ou qualquer coisa que tiver dentro dele.
Quanto a solução de usar um componente pai, eu pessoalmente não gosto porque fica parecendo POG. O div, table, t:panelGroup, whatever… não faz a sua real função, ele está lá pra cobrir uma não funcionalidade do AJAX. Por outro lado minha solução também não me agrada. Um componente vai ser compilado mas vai ficar escondido até que, isso se, alguém precisar dele, mas vai do gosto.
É claro que estou falando pro caso de se usar re-render pra um componente isolado. Para um grupo, sem dúvida acho melhor o componente pai.
Então oq eu quero reRenderizar no caso é apenas um h:message que está da seguinte forma:
<h:messages id=“messages” globalOnly=“true” styleClass=“message”
errorClass=“errormsg” infoClass=“infomsg” warnClass=“warnmsg”
rendered="#{showGlobalMessages != ‘false’}" />
se eu tentar dar um reRender em messages não da certo. eu quero reRenderizar apenas ele e mais nada alem dele. Eu coloquei ele dentro de um panelGroup mas achei meio POG, pq é um componente só…
Pelo oq entendi sempre que eu tiver um componente que tiver um rendered eu devo colocar ele dentro de um componente maior que não possui um rendered atribuido a ele e mandar renderizar esse componente maior? é isso?
Na verdade não chamaria bem de POG, já que o Richfaces (ou qualquer outra engine/framework ajax) não poderia descobrir sozinho a posição de um objeto na árvore DOM sem que talvez predudicasse layout (inserir spans, divs etc de marcação). Mas com certeza há algumas soluções, porém difícil seria saber os efeitos colaterais.
Neste caso eu aconselho o uso do componente a4j:outputPanel com o atributo ajaxRendered como true. Ou simplesmente a utilização do componente de mensagens do Richfaces, rich:messages, assim não seria necessário a utilização de um componente pai.
Exatamente. Isso devido aquele problema que expliquei anteriormente.
Enfim, não é um problema unicamente do Richfaces. O Trinidad e o Icefaces também passam por isso.
Abraços.
Obrigado a todos pela ajuda, foi muito útil para mim
Na verdade não chamaria bem de POG, já que o Richfaces (ou qualquer outra engine/framework ajax) não poderia descobrir sozinho a posição de um objeto na árvore DOM sem que talvez predudicasse layout (inserir spans, divs etc de marcação). Mas com certeza há algumas soluções, porém difícil seria saber os efeitos colaterais.
Neste caso eu aconselho o uso do componente a4j:outputPanel com o atributo ajaxRendered como true. Ou simplesmente a utilização do componente de mensagens do Richfaces, rich:messages, assim não seria necessário a utilização de um componente pai.
Exatamente. Isso devido aquele problema que expliquei anteriormente.
Enfim, não é um problema unicamente do Richfaces. O Trinidad e o Icefaces também passam por isso.
Abraços.[/quote]
Boa tarde pessoal!
Estou começando agora com JSF, e estou tentando fazer que apenas um pedaço da minha pagina renderize, mas nao estou conseguindo nem a pau! Quando o evento eh acionado toda minha pagina se renderiza! Alguem ai consegue me dar uma maozinha? Aqui vai meu codigo de teste! Preciso renderizar soh a parte do panel que tem um google maps dentro!
Grato desde ja pessoal!
<ui:composition xmlns=“http://www.w3.org/1999/xhtml”
xmlns:ui=“http://java.sun.com/jsf/facelets”
xmlns:h=“http://java.sun.com/jsf/html”
xmlns:f=“http://java.sun.com/jsf/core”
xmlns:a4j=“http://richfaces.org/a4j”
xmlns:rich=“http://richfaces.org/rich”>
<h:form id="form1">
<a4j:outputPanel id="mapa" rendered="true">
<a4j:include viewId="#{echoBean.url}"/>
</a4j:outputPanel>
<h:outputText value="Enter some text: " />
<h:inputText value="#{echoBean.text}">
<a4j:support disableDefault="true" event="onkeyup" reRender="mapa,echo,form1"/>
</h:inputText>
<h:outputText id="echo" value="Echo: #{echoBean.text}" />
</h:form>
</ui:composition>
Não consigo renderizar um jsp:include
minha duvida ta em outro topico alguem poderia ajudar?
Sensacional a explicação do rponte !!
valeuuu !!
Galera!
Estou tentando renderizar uma div e não estou conseguindo!!
Esta div está estilizada (tipo balão de comic-books) para exibir a validação dos formulários. A página deve carregar com a div escondida e exibir qndo a validação ocorrer.
Segue trecho do código:
<h:form class="formulario_cadastro_login">
<a4j:queue />
<div class="nome_login">
<label> <h:outputText value="#{msgBundle.nome}" /> </label>
<h:inputText id="nome" value="#{clientePB.cliente.nome}"
class="cadastro_campo_login" style="estilo.css"
required="true" label="Nome">
<a4j:support event="onblur" action="#{clientePB.validacaoNome}" id="ajax_valida" reRender="j_id30:valida_login_nome" />
<!-- <f:validateLength minimum="3" maximum="99" />-->
<!-- <rich:ajaxValidator id="ajax_valida_nome" event="onkeyup" reRender="valida_login_nome" />-->
<rich:ajaxValidator event="onblur" />
</h:inputText>
<a4j:outputPanel id="valida_nome_login">
<a4j:outputPanel id="valida_login_nome" rendered="ajax_valida">
<div id="valida_login" >
<rich:messages />
</div>
</a4j:outputPanel>
</a4j:outputPanel>
</div>
</h:form>
Alguma sugestão do que pode estar errado?
[quote=gugaa_df]Pessoal estou tendo problemas para reRenderizar meus componentes.
Possuo dois formulários e alguns botões e de acordo com alguns cliques é exibido um ou outro, o mesmo acontece para os botões deste formulário.
Quando eu passo no reRender do meu botão ajax os ids dos componentes que eu quero renderizar novamente ele não faz o reRender.
Só está funcionando quando eu coloco os componentes dentro de um panelGroup e manda renderizar novamente o panelGroup.
pq isso?[/quote]
coloque um id no seu form e renderize esse id :), se tentar renderizar somente o panelgrid ou o nome do componente não vai conseguir. Ou ainda pode criar um novo form somente para esse componente, ou ainda pode colocar o parâmentro rerendered dentro do seu messages para que ele seja mostrado caso alguma coisa aconteça.
Seu botao que renderiza a div esta dentro desse form ai que vc passou?
Everton,
Quem renderiza é o<a4j:support event=“onblur” action="#{clientePB.validacaoNome}" id=“ajax_valida” reRender=“j_id215:valida_nome_login” />
Ainda não tive sucesso, você tem idéia do que pode estar ocorrendo de errado?
Everton,
Quem renderiza é o<a4j:support event=“onblur” action="#{clientePB.validacaoNome}" id=“ajax_valida” reRender=“j_id215:valida_nome_login” />
Ainda não tive sucesso, você tem idéia do que pode estar ocorrendo de errado?[/quote]
Esse id que vc ta renderizando é o gerado pelo html, isso ta correto? Se sim, tenta trocar seu form <h:form…> pelo form do ajax a4j:form...
Não funcionou cara…
Estou verificando algo com o ajaxcontext, alguém já usou este parâmetro?
Galera,
Consegui colocar pra funcionar, olha só o código:
<h:form styleClass="formulario_cadastro_login"
id="form_cad_nome">
<label> <h:outputText value="#{msgBundle.nome}" /> </label>
<rich:messages for="cadastro_campo_login" />
<h:inputText id="cadastro_campo_login"
value="#{clientePB.cliente.nome}"
class="cadastro_campo_login" style="estilo.css" label="Nome">
<a4j:support event="onblur" reRender="valida_nome_parent"
action="#{clientePB.validacaoNome}" />
</h:inputText>
<a4j:outputPanel id="valida_nome_parent">
<a4j:outputPanel id="valida_login_nome"
rendered="#{clientePB.validacao}">
<div id="valida_login">
<h:outputText value="#{clientePB.msgValidacaoNome}" />
</div>
</a4j:outputPanel>
</a4j:outputPanel>
</h:form>
O que estava dando erro também foi o seguinte, meu form com a DIV para renderizar estava dentro de um <a4j:outputPanel rendered="#{sessionScope.u.nome == null}"> </a4j:outputPanel>. Ainda estou tentando resolver este problema pois preciso que este trecho somente esteja visível quando o usuário não estiver logado.
Por que o A4J não funciona dentro de um 4j:outputPanel? Tem algo a ver com naming container?
Valeu pela ajuda galera!