blockmonork 1 Denunciar post Postado Agosto 14, 2009 Prezados, Desculpem se já houver um post com problema semelhante a este, mas não encontrei nas pesquisas que fiz. Tenho um sistema que utiliza 2 componentes: um combobox e um list. o combo carrega um xml "categorias" (neste xml tem uma lista links pra carregar outros xml relativos à categoria, com seus próprios valores) o evento change do combo chama uma função que carrega o list (o list puxa o arquivo xml pra exibir na tela) o problema é que ao mudar o combo, o evento "change" do list é duplicado, a cada vez que eu mudo o combo, ao clicar no item do list, ele vai aumentando gradativamente o chamado ao change. No evento change do combo, eu chamei o método "list.removeAll()" mas não adianta, este método apenas "limpa" o componente visualmente, mas parece que o list guarda uma espécie de index que vai acumulando a cada vez que ele carrega dados. Para ficar mais fácil de entender, segue abaixo o código (obs: utilizo o AS 2) --------------- CÓDIGO var categoria:String = 'categorias.xml'; // URL FINAL = '_Categorias/apps/categorias.xml'; System.useCodepage = true; Stage.showMenu = false; var xml:XML = new XML(); xml.ignoreWhite = true; xml.onLoad = function() { var combo_list:Object = new Object(); qtde = xml.firstChild.childNodes.length; for (i=0; i<qtde; i++) { cat = xml.firstChild.childNodes[i].attributes.cat; alvo = xml.firstChild.childNodes[i].attributes.alvo; combo.addItem({label:cat, data:alvo}); if (i == 0) { Listar(alvo); } } combo_list.change = function(evt:Object) { lista.removeAll(); Listar(evt.target.value); }; combo.addEventListener("change", combo_list); }; xml.load(categoria); function Listar(str:String) { var sub_xml:XML = new XML(); var list_list:Object = new Object(); sub_xml.ignoreWhite = true; sub_xml.onLoad = function(success) { lista_num = sub_xml.firstChild.childNodes.length; for (i=0; i<lista_num; i++) { descricao = sub_xml.firstChild.childNodes[i].attributes.descricao; link = sub_xml.firstChild.childNodes[i].attributes.link; lista.addItem({label:descricao, data:link}); } list_list.change = function(evt:Object) { Abrir(evt.target.selectedItem.data);//value); }; lista.addEventListener("change", list_list); }; sub_xml.load(str); } function Abrir(link:String) { /* AQUI ACONTECE O PROBLEMA - SE CLICAR NO LIST NA PRIMEIRA VEZ QUE O PROGRAMA RODA, O GET URL É CHAMADO UMA VEZ, MAS SE EU ALTERAR O COMBO E CLICAR NOVAMENTE NA LISTA, ESSA FUNÇÃO JÁ É CHAMADA 2X E ASSIM SUCESSIVAMENTE. AS CHAMADAS VÃO AUMENTANDO À CADA ALTERAÇÃO DO COMBO TENTEI FAZER UMA GAMBIARRA, CRIANDO UM CONTADOR QUE INCREMENTAVA A CADA "CHANGE" DO LIST E LIMITANDO-O A 1a CHAMADA, MAS NÃO DEU CERTO. */ trace('==================-> getURL('+link+', "_blank");'); } Será que isso é um bug do componente list ou eu é que estou fazendo algo errado? Se puderem me ajudar, Obrigado a todos Compartilhar este post Link para o post Compartilhar em outros sites
blockmonork 1 Denunciar post Postado Agosto 15, 2009 Amigos, já podem dar este post por resolvido. Embora gostaria de saber por quê esse problema ocorreu no componente List. Resolvi o problmea com uma "gambiarra", embora não fiquei satisfeito com a técnica que tive que usar, o código pelo menos está funcionando. Segue abaixo (para quem interessar, analisá-lo e sugerir outra solução) var categoria:String = '_Categorias/apps/categorias.xml'; System.useCodepage = true; Stage.showMenu = false; var xml:XML = new XML(); xml.ignoreWhite = true; var clic_vez:Number = 0; var combo_vez:Number = 0; xml.onLoad = function(success) { var combo_list:Object = new Object(); qtde = xml.firstChild.childNodes.length; for (i=0; i<qtde; i++) { cat = xml.firstChild.childNodes[i].attributes.cat; alvo = xml.firstChild.childNodes[i].attributes.alvo; combo.addItem({label:cat, data:alvo}); if (i == 0) { combo_vez = 1; Listar(alvo); } } combo_list.change = function(evt:Object) { clic_vez = 0; combo_vez++; lista.Li.removeAll(); Listar(evt.target.value); }; combo.addEventListener("change", combo_list); }; xml.load(categoria); function Listar(str:String) { var ok:Number = 0; var sub_xml:XML = new XML(); var list_list:Object = new Object(); list_list.value = 0; sub_xml.ignoreWhite = true; sub_xml.onLoad = function(success) { lista_num = sub_xml.firstChild.childNodes.length; for (i=0; i<lista_num; i++) { descricao = sub_xml.firstChild.childNodes[i].attributes.descricao; link = sub_xml.firstChild.childNodes[i].attributes.link; lista.Li.addItem({label:descricao, data:link}); } list_list.change = function(evt:Object) { clic_vez++; Abrir(evt.target.selectedItem.data); }; lista.Li.addEventListener("change", list_list); }; sub_xml.load(str); } List.removeAll(); function Abrir(link:String) { // RESOLVIDO AQUI! SOMEI CADA ALTERAÇÃO DO COMBO E USANDO O RESTO DA DIVISÃO PELO NUMERO DE CLICS DO LIST, LIMITEI A CHAMADA AO GETURL A UMA SÓ. ok = (clic_vez%combo_vez); if (ok == 0) { trace('==================-> getURL('+link+', "_blank");'); } } Quem puder ajudar. Obrigado, abs Compartilhar este post Link para o post Compartilhar em outros sites