Ajax nao funciona no componete

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

Seu listener está sendo chamado ?

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.

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.

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

nao possuo nenhum componete com required

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.

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

Pense bem no que este cara faz:

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

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

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?

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

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.

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

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

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

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

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.

Obrigado, Aluisio!

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

Abraços!