Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

blockmonork

[Resolvido] Bug no component List

Recommended Posts

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.