Ajax nao funciona no componete

18 respostas
D

pessoal estou com este codigo…

<ui:repeat var="vnivel" value="#{projetoController.nivelProjetos}">
            
		            <p:selectOneMenu id="city" value="#{testeController.classificacao.idclassificacao}" rendered="#{vnivel.nivel eq 1}">  
		                <f:selectItem itemLabel="Select City" itemValue="" />  
		                <f:selectItems value="#{testeController.classificacaoPorNiveis}" var="classificacao" 
		                			   itemLabel="#{classificacao.nomeClassificacao}" 
		                			   itemValue="#{classificacao.idclassificacao}" />  
		                <p:ajax update="suburbs"  
		                        listener="#{testeController.montaSelectN2(2)}" />  
		            </p:selectOneMenu> 

		            <p:selectOneMenu id="suburbs" value="#{testeController.suburb}" rendered="#{vnivel.nivel eq 2}">  
		                <f:selectItem itemLabel="Select Suburb" itemValue="" />  
		                <f:selectItems value="#{testeController.suburbs}" 
		                				   var="classificacao" 
			                			   itemLabel="#{classificacao.value}" 
			                			   itemValue="#{classificacao.value}" />
			            <p:ajax update="suburbs3"  
		                        listener="#{testeController.montaSelectN2(3)}" />  
		            </p:selectOneMenu>

		            <p:selectOneMenu id="suburbs3" value="#{testeController.suburb}" rendered="#{vnivel.nivel eq 3}">  
		                <f:selectItem itemLabel="Select Suburb" itemValue="" />  
		                <f:selectItems value="#{testeController.suburbs}" 
		                				   var="classificacao" 
			                			   itemLabel="#{classificacao.value}" 
			                			   itemValue="#{classificacao.value}"/> 
		                <p:ajax update="suburbs"  
			                        listener="#{testeController.montaSelectN2(4)}" />   
		            </p:selectOneMenu>
            </ui:repeat>

o que ocorre é que o segundo select nao esta sendo atualizado pelo ajax
alguem saberia me dizer o pq?

abç a todos!!

18 Respostas

Rodrigo_Sasaki

Seu listener está sendo chamado ?

rodrigoromero.lima

Dentro do form tem algum componente com required = true?
Se tiver ele não vai entrar no listener e não vai atualizar, defina no p:ajax o que deve ser processado só o selectOneMenu ou outros componentes.

rodrigoromero.lima

Dentro do form tem algum componente com required = true?
Se tiver e este estiver vazio ele não vai entrar no listener e não vai atualizar, defina no p:ajax o que deve ser processado só o selectOneMenu ou outros componentes.

D

obrigado pela atenção

entao o mentodo esta sendo chamado so nao esta atualizando o componente…
a lista esta vindo preenchida mais nao carrega no select

sabe o que pode ser?
abç!!

D

nao possuo nenhum componete com required

aluisiodsv

Vc está tentando dar um update em um id que não está presente na página. Ex: suburbs está com um atributo rendered="#{vnivel.nivel eq 2}" que está falso e dizendo que não é pra renderizá-lo na página, entretanto vc está pedindo pra que este id seja atualizado.

Recomendo criar um container pra ele:
Ex:

<h:outputPanel id="containerCity">
    <p:selectOneMenu id="city" value="#{testeController.classificacao.idclassificacao}" rendered="#{vnivel.nivel eq 1}">
        <f:selectItem itemLabel="Select City" itemValue="" />
        <f:selectItems value="#{testeController.classificacaoPorNiveis}" var="classificacao" itemLabel="#{classificacao.nomeClassificacao}" itemValue="#{classificacao.idclassificacao}" />
        <p:ajax update="containerSuburbs" listener="#{testeController.montaSelectN2(2)}" />
    </p:selectOneMenu>
</h:outputPanel>

<h:outputPanel id="containerSuburbs">
    <p:selectOneMenu id="suburbs" value="#{testeController.suburb}" rendered="#{vnivel.nivel eq 2}">
        <f:selectItem itemLabel="Select Suburb" itemValue="" />
        <f:selectItems value="#{testeController.suburbs}" var="classificacao" itemLabel="#{classificacao.value}" itemValue="#{classificacao.value}" />
        <p:ajax update="containerSuburbs3" listener="#{testeController.montaSelectN2(3)}" />
   </p:selectOneMenu>
</h:outputPanel>

não copie meu código e cole por cima do seu pois só quis mostrar o q deve ser feito e escrevi na mão, pode ser que tenha alguma coisa errada.

D

pessoal fiz as modificações que me sugeriram mais nao funcionou alguma ideia?

<ui:repeat var="vnivel" value="#{projetoController.nivelProjetos}">

            				<p:outputPanel id="container1">
			            			<h:outputLabel value="#{vnivel.descricao}" rendered="#{vnivel.nivel eq 1}"/>
					     			<p:selectOneMenu value="#{testeController.classificacao.idclassificacao}" rendered="#{vnivel.nivel eq 1}">
										<f:selectItem itemLabel="Selecione #{vnivel.descricao}" itemValue="" />
										<f:selectItems value="#{testeController.classificacaoDoProjeto}" 
					    							var="classificacao" itemLabel="#{classificacao.nomeClassificacao}" 
					    							itemValue="#{classificacao.idclassificacao}" />
					    				<p:ajax update="container2" 
					    						listener="#{testeController.montaSubSelect(2)}"
					    						onerror="alert('erro')" 
						                        onsuccess="alert('sucesso')" 
						                        oncomplete="alert('completado')"
						                        onstart="alert('partindo')" >
					    				</p:ajax> 
									</p:selectOneMenu> 
				     	</p:outputPanel>
		            
		            <p:outputPanel id="container2">
						<h:outputLabel value="#{vnivel.descricao}" rendered="#{vnivel.nivel eq 2}"/>
			            <p:selectOneMenu id="nivel2" value="#{testeController.classificacao.idclassificacao}" rendered="#{vnivel.nivel eq 2}">  
			                <f:selectItem itemLabel="Select Suburb" itemValue="" />  
			                <f:selectItems value="#{testeController.nivel2}" />
			                				 
				            <p:ajax update="container3"  
			                        listener="#{testeController.montaSubSelect(3)}" 
			                        onerror="alert('erro')" 
			                        onsuccess="alert('sucesso')" 
			                        oncomplete="alert('completado')"
			                        onstart="alert('partindo')" immediate="true"/>  
		            	</p:selectOneMenu>
		            </p:outputPanel>
		            
		            <p:outputPanel id="container3">
						<h:outputLabel value="#{vnivel.descricao}"  rendered="#{vnivel.nivel eq 3}"/>
			            <p:selectOneMenu id="nivel3" value="#{testeController.classificacao.idclassificacao}" rendered="#{vnivel.nivel eq 3}">  
			                <f:selectItem itemLabel="Select Suburb" itemValue="" />  
			                <f:selectItems value="#{testeController.nivel3}" /> 
			                
			            </p:selectOneMenu>
		           </p:outputPanel>
            </ui:repeat>

ele continua sem atualizar o proximo select
abç!!

aluisiodsv

Pense bem no que este cara faz:

rendered="#{vnivel.nivel eq 2}"

D

aluisiodsv eu sei o que o rendered faz…

o problema é que preciso criar o select de acordo com os nivies pq a lista sao diferentes, entao cada select tem uma lista, minha ideia era so renderizar os select de por nivel ele renderiza mais pelo visto com o ajax da pau, vc poderia me dar alguma ideia de como fazer isso??

abç e obrigado!!!

aluisiodsv

Na vdd eu quis dizer outra coisa.

Vc está usando um ui:repeat com a variável vnivel.

Vamos supor que os dados do primeiro objeto sejam:
vnivel.descricao = “Teste”
vnivel.nivel = 1

Ao renderizar os 3 primeiros combos ficaria:
Assim:
container1

  • Teste
  • Os itens da combo
    container2
  • Nada pois o vnivel.nivel não é igual a 2
    container3
  • Nada pois o vnivel.nivel não é igual a 3

Ao atualizar os dados da combo do container2 o vnivel.nivel ainda é 1, por isso ele continua sem renderizar.

Deu pra entender?

D

entendi sim, mais eu pensei que quando a pagina fosse carregada todos os campos estariam nela, no caso quando terminase de interar a lista os combos estariam na pagina…
vc teria alguma sugestao pra me dar em como posso resolver isso?

obrigado abç!!

aluisiodsv

Então, é exatamente isso que o rendered faz, caso seja falso não inclui no html.

Poderia explicar a regra de negócio que vc quer?
Talvez possa ter soluções mais fáceis.

D

Eu preciso montar o select dinamicos com lista dinamica…

ex:

um projeto aqui pode ter n nivies
cada nivel representa um select um exemplo

Nivel 1 Pais
dentro do select de primeiro nivel

Brasil
EUA

caso seja selecionado o Brasil preenche o segundo nivel com as Estados do brasil
Nivel 2
rio de janeiro
belo horizonte
Espirito santo

caso o selecionado for EUA preenche o segundo nivel com os Estado dos EUA

California
los angels
Florida

e assim sucessivamente ate o total de niveis do prjeto

o meu problema se resume ao ajax nao renderizar, o que ja sei o pq como vc ja me explicou
bom é isso aluisiodsv se puder me dar uma força em como eu posso resolver este problema.

obrigado abç!!

ninvit

Fala, Neo. Beleza?

Eu acredito que a sua dúvida/problema seja exatamente o mesmo que estou tendo: http://www.guj.com.br/java/291672-jsf-20---dropdown-dependente
Acho que a solução está no BackinBean, ou seja lá como você chame o seu MB.

Pode postar o seu pra nós?

Abraços

D

fala ninvit blz!!!

cara pelo o que entendi o seu problema vc quer selecionar uma origem e dependendo da origem selecionada traz os destinos e selecionando o destino vc traz os planos
cara é bem tranks fazer isso…

vc precisa de tres selectOneMenu no sua pag xhtml cada select tera uma lista uma para origem uma para plano e outra pra custo, eu acredito que sua tabela esta bem relacionada
bom seguindo este raciocinio vc pode fazer um select trazendo os destinos de acordo com a origem selecionada e com o ajax vc atualiza o proximo select

vou te dar um ex simples ok

<p:selectOneMenu id="origem" value="#{suaListadeorigem.origem}">  
                <f:selectItem itemLabel="Select Origem" itemValue="" />  
                <f:selectItems value="#{suaController.suaListadeorigem}" />  
                <p:ajax update="destino"  
                        listener="#{controller2.metodoQueRetornaAnovaLista}" />  
            </p:selectOneMenu>

<p:selectOneMenu id="destino" value="#{suaController.Destino}">  
                <f:selectItem itemLabel="Select destino" itemValue="" />  
                <f:selectItems value="#{suaController.listaDestino}" />  
                <p:ajax update="suburbs"  
                        listener="#{controller2.handleCityChange}" />  
            </p:selectOneMenu>

<p:selectOneMenu id="plano" value="#{controller2.plano}">  
                <f:selectItem itemLabel="Select City" itemValue="" />  
                <f:selectItems value="#{suaController.listaPlanos}" />   
            </p:selectOneMenu>

no seu manager bem com o metodo pasado no listener vc recupera o ID do item selecionado e traz a os destinos com o ID de origem

espero ter ajudado
abç!!!

ninvit

Fala, neo!!
Brigadão, cara!

Nessa parte eu cheguei, entendi certinho. Se for com uma lista estática eu consigo fazer sem problemas.
O problema é que eu não estou conseguindo implementar o metodo handleCityChange com minhas listas vindo do BD.

Alguma ideia?

Abraços

aluisiodsv

Teoricamente funciona assim:
Ao cair no listener do primeiro select, significa q vc já selecionou algum item, a partir deste item selecionado vc vai no banco de dados e busca todos os estados relacionados. Com a lista de estados já buscada no banco vc atualiza a variável que contém os itens, no caso a suaController.listaDestino. Isso tudo dentro do listener, após feito isso, ao atualizar o segundo select, esta variável já terá os dados pra preencher.

Assim funcionaria com o último select tbm.

Se sua dúvida for como implementar o código que busca estes dados no banco de dados, vc poderia dar mais informações sobre como está a arquitetura do seu projeto pra saber como te ajudar nisso.

ninvit

Obrigado, Aluisio!

Será que você pode dar uma olhada no tópico onde estou pedindo ajuda, por favor?

Abraços!

Criado 17 de janeiro de 2013
Ultima resposta 22 de jan. de 2013
Respostas 18
Participantes 5