Problema na hora de editar, com combobox aninhado + json + Vraptor [RESOLVIDO]

Pessoal tenho um combobox aninhado, funciona perfeitamente na hora de inserir dados no BD, porem uma hora eu tenho que alterar algo(editar), ai o problema,

quando chamo o editar, ele traz as informações do banco certo, e a UF do combo correta, porem o municipio nao consigo trazer o correto, tipo, meu cadastro esta assim:

UF: RJ cidade: PETROPOLIS

ele traz

UF: RJ cidade: ARAIAL - no caso a primeira.

NA UF esta assim

	<label>Estado:</label>
                 <select name="uf.nome" id="estadoDropdown" > 
                  <option value="${bci.municipioEntrega.uf.id}">${bci.municipioEntrega.uf.nome}</option> // chamo aki para preencher corretamente .. OK
                    <c:forEach var="u" items="${ufs}">    
                        <option value="${u.id}">${u.nome}</option>    
                    </c:forEach>    
                </select>

e municipio assim:

<label for="municipio">municipio:</label> 
				<select name="bci.municipioEntrega.id" id="municipio">
			</select> 

Tem como eu inserir o correto sendo o primeiro???

vlw

tem sim… o jeito mais fácil é fazer isso via javascript…

depois que ele carregar o combo de municípios, faça (supondo q vc usa jQuery):

$('#municipio').val('${bci.municipioEntrega.id}');

esse código dentro de alguma tag script, dentro da jsp.

lembrando que isso tem q rodar depois q o combo foi carregado

Não funcionou, coloquei la no fim da jsp. o que será que ta de errado? :frowning:

tem certeza que isso tá acontecendo depois que o combo de municipios está populado?

Ta populado sim, fiz uma alteracao aqui: coloquei um option assim:

	<label for="municipio">municipio:</label> 
				<select id="municipio" name="bci.municipioEntrega.id">	
				<option selected="selected" value="${bci.municipioEntrega.id}">${bci.municipioEntrega.nome}</option>// nao precisa disso para popular mas fiz um teste.
			</select> 

apos abri o fonte no navegador.

label for="municipio">municipio:</label> 

				<select id="municipio" name="bci.municipioEntrega.id">

				

				<option selected="selected" value="6670">BANQUETE</option>// no fonte aparece correto mas no navegador aparece abarracamento q é o primeiro da lista

		

			</select> 

Que coisa nao?

Depois que coloquei o OPTION chega dar uma piscada no combo com o valor correto porem muda para o promeiro da lista. vou tentar umas modificacoes aki…

Não consegui ainda :frowning: , tem alguma outra sugestão Lucas?

qual é o código que vc está usando pra popular o combo de municipios?

Vou postar todos:

dao

@SuppressWarnings("unchecked")
	public List<Municipio> listaUfMunicipio(Long uf) {
		Session session = (Session) em.getDelegate();
		return session.createCriteria(Municipio.class)
				.add(Restrictions.like("uf.id", uf)).list();
	}

controller

@Get
	@Path("/municipios/buscaMunicipios.json")
	public void loadMunicipios(Long uf) {
		List<Municipio> municipios = dao.listaUfMunicipio(uf);
		result.use(Results.json()).withoutRoot().from(municipios).serialize();
	}

JS

(function($) {
  $.fn.emptySelect = function() {
    return this.each(function(){
      if (this.tagName=='OPTION') this.options.length = 0;
    });
  }

  $.fn.loadSelect = function(data) {
    return this.emptySelect().each(function(){
      if (this.tagName=='OPTION') {
        var selectElement = this;
   
        $.each(data,function(index,optionData){
       
                var option = new Option(optionData.nome,
                    optionData.id);
               
          if ($.browser.msie) {
            selectElement.add(option);
          }
          else {
            selectElement.add(option,null);
          }
        });
      }
    });
  }
})(jQuery);

JS

function adjustMunicipioDropdown() {
        var estadoValue = $('#estadoDropdown').val();
        var dropdownSet = $('#municipio');
        if (estadoValue.length == 0)
        {
                dropdownSet.attr("disabled", true);
                dropdownSet.emptySelect();
        }
                else
        {
                dropdownSet.attr("disabled", false);

                $.getJSON('/webgeo/municipios/buscaMunicipios.json', {
                        uf : estadoValue
                }, function(q) {
                        dropdownSet.loadSelect(q);
                });
        }
}

JSP

label for="municipio">municipio:</label> 
				<select id="municipio" name="bci.municipioEntrega.id"></select>
                                  

Ta tudo ai…

vc deve ter em algum lugar a chamada:

adjustMunicipioDropdown();

se isso estiver na jsp, faça:

adjustMunicipioDropdown();
$('#municipio').val('${bci.municipioEntrega.id}');

se não funcionar, tenta trocar de .id pra .nome

Lucas fiz o que falou:

[code][/code]

e não funcionou, porem fiz um teste aqui: se eu tirar o

name="bci.municipioEntrega.id"[/quote] do select não faz diferença na listagem, só não salva nada na hora de alterar.

Provavelmente por isso que não esta funcionando.
mas não consigo ver uma solução.

move o código do val pra dentro do ajaxStop (o getJSON é assincrono, por isso não deve estar funcionando)…

pra evitar que ele faça sempre, coloque uma var booleana pra que ele só faça uma vez

Opa, deu resultado fiz parte do que falou, eu acho:

<script type="text/javascript"> $(function(){ $('#loading').hide(); $('#estadoDropdown').change(function(){ adjustMunicipioDropdown(); }).change(); $('#loading').ajaxStart(function() { $(this).show(); }); $('#loading').ajaxStop(function(){ adjustMunicipioDropdown(); $('#municipio').val('${bci.municipioEntrega.id}'); }).change(); $(this).hide(); }); </script>

porem ficou em um loop infinito, não da para selecionar outro município agora, como fazer essa var booleana, nao saco nada de JS quase. :frowning:

não coloque o adjust, só o val:

var loaded = false
$('#loading').ajaxStop(function(){  
       if (!loaded) {
         loaded = true;
         $('#municipio').val('${bci.municipioEntrega.id}');  
       }
       $(this).hide();  
});  

Mantive o ajust de cima.
ficou assim:$(function(){ $('#loading').hide(); $('#estadoDropdown').change(function(){ adjustMunicipioDropdown(); }).change(); $('#loading').ajaxStart(function() { $(this).show(); }); var loaded = false; $('#loading').ajaxStop(function(){ if (!loaded) { loaded = true; $('#municipio').val('${bci.municipioEntrega.id}'); } $(this).hide(); });

porem agora nao aparece nada no combo. :frowning:

coloque isso como primeira linha dentro do seu $(function(){

if ('${bci.municipioEntrega.id}')
    adjustMunicipioDropdown();

daí ele já preenche os municípios com o que foi colocado na edição

Ve se eu coloquei do jeito que vc falou, acho que eu deve ter feito algo errado pois nao deu certo :frowning: :

$(function(){
	if ('${bci.municipioEntrega.id}')
	    adjustMunicipioDropdown();
   $('#loading').hide();
   $('#estadoDropdown').change(function(){
       adjustMunicipioDropdown();
     }).change();
   $('#loading').ajaxStart(function() {
       $(this).show();
   });
   var loaded = false
   $('#loading').ajaxStop(function(){  
          if (!loaded) {
            loaded = true;
            $('#municipio').val('${bci.municipioEntrega.id}');  
          }
          $(this).hide();  
   });  

o combo de municipios veio preenchido? o estado está selecionado?

sim o do estado já vem selecionado. mais o do municipio nao esta populando. :frowning:

ele tava populando antes? se sim talvez tenha algum erro de javascript =/

instala o firebug no firefox e vê se acusa algum erro