lucasmarcal 0 Denunciar post Postado Dezembro 18, 2009 Salve Pessoal Estou com um problema, estou estudando sobre eventos personalizados no AS3 mas estou com algumas duvidas e resolvi compartilhar para ver se consigo uma solução. Eu criei 3 classes são elas: Consome.as Dados.as EventosCustomizados.as A classe Consome.as é a "MainClass" da minha aplicação, ela cria uma referencia de Dados.as e passa um array como parametro. A classe Dados.as é tem métodos para alterar o valor de um Array definido nela, quando ela faz isso ela dispara um evento para a classe EventosCustomizados.as que é "escutado" na própria classe Dados.as através de um Listener, bom até ai tudo bem. O que eu gostaria de saber é como eu faço para que a classe Consome.as escute o evento da classe EventosCustomizados.as somente quando o evento for solicitado. Segue as classes para ilustrar isso que foi dito. Consome.as package eventos { import flash.display.MovieClip; import eventos.* import flash.events.MouseEvent; /** * ... * @author ... */ public class Consome extends MovieClip { var refDados:Dados public function Consome() { this.refDados = new Dados(["Lucas","Luana","Noelle"]) } } } Dados.as package eventos { import eventos.* import flash.display.MovieClip; /** * ... * @author ... */ public class Dados extends MovieClip { var meuArray:Array = new Array() public function Dados(_ref:Array) { this.meuArray = _ref addEventListener(EventoCustomizado.EVENTO_PRINCIPAL, onPush) dispatchEvent(new EventoCustomizado(EventoCustomizado.EVENTO_PRINCIPAL)); } private function onPush(e:EventoCustomizado):void { trace("Ocorreu Evento e o array foi populado") } } } EventosCustomizados.as package eventos { import flash.events.Event; import flash.events.EventDispatcher; /** * ... * @author ... */ public class EventoCustomizado extends Event { public static const EVENTO_PRINCIPAL:String = "evento_principal"; public function EventoCustomizado(type:String, bubbles:Boolean = false, cancelable:Boolean = false) { super(type, bubbles, cancelable); } } } Agradeço a atenção de todos! Compartilhar este post Link para o post Compartilhar em outros sites
Eder Fortunato 15 Denunciar post Postado Dezembro 18, 2009 você quer que a classe Consome, escute o evento? se for isso, na hora de dispara-lo, faça assim: dispatchEvent(new EventoCustomizado(EventoCustomizado.EVENTO_PRINCIPAL, true)); esse "true", é da propriedade "bubbles", ela server para fazer o evento subir a hierarquia assim você pode captura-lo na classe Consome, que é a principal: this.refDados = new Dados(["Lucas","Luana","Noelle"]) this.addEventListener(EventoCustomizado.EVENTO_PRINCIPAL, fazAlgo) testa ai []´s Compartilhar este post Link para o post Compartilhar em outros sites
lucasmarcal 0 Denunciar post Postado Dezembro 18, 2009 Eder Esse dispatchEvent(new EventoCustomizado(EventoCustomizado.EVENTO_PRINCIPAL, true)); tem que está na classe consome tb ? ou na classe consome.as eu coloco apenas o this.addEventListener(EventoCustomizado.EVENTO_PRINCIPAL, fazAlgo) ? Pq na verdade isso vai servir para uma classe que traz dados do Twitter e depois da chamada o método ela tem um Delay até chegar a informação, por isso queria adicionar esse listener em consome.as para quando o evento "EVENTO_PRINCIPAL" ocorrer ele me avise e eu possa dar seqüencia na aplicação. abs Compartilhar este post Link para o post Compartilhar em outros sites
Eder Fortunato 15 Denunciar post Postado Dezembro 18, 2009 então você quer que a consome.as seja avisada quando o array for populado? se for isso, então seria dentro da função 'onPush' que você dispararia o evento private function onPush(e:EventoCustomizado):void { trace("Ocorreu Evento e o array foi populado") dispatchEvent(new EventoCustomizado(EventoCustomizado.POPULOU_EVENTO)); } repare que eu coloquei outro nome, pois o evento é outro, então tem que declarar essa variavel lá no EventoCustomizado.as agora, para que a Consome.as seja avisada: this.refDados = new Dados(["Lucas","Luana","Noelle"]) this.refDados.addEventListener(EventoCustomizado.POPULOU_EVENTO, fazAlgo) nesse caso não precisou do 'true' no dispatchEvent, já que o addEventListener foi adicionado na mesma classe que faz o dispatchEvent acho que seria isso []´s Compartilhar este post Link para o post Compartilhar em outros sites
lucasmarcal 0 Denunciar post Postado Dezembro 18, 2009 Infelizmente não deu certo, estranho pq a logica está correta, o pior é que o assunto sobre isso na Net é de baixa qualidade, só aqui no imasters estou conseguindo essa ajuda. Consome.as package eventos { import flash.display.MovieClip; import eventos.Dados import eventos.EventoCustomizado import flash.events.MouseEvent; /** * ... * @author ... */ public class Consome extends MovieClip { var refDados:Dados public function Consome() { this.refDados = new Dados(["Lucas", "Luana", "Noelle"]) this.refDados.addEventListener(EventoCustomizado.ALTEROU_ARRAY, fazAlgo); } private function fazAlgo(e:EventoCustomizado):void { trace("Em Consome " + this.refDados.meuArray) } } } Dados.as package eventos { import eventos.* import flash.display.MovieClip; /** * ... * @author ... */ public class Dados extends MovieClip { var meuArray:Array = new Array() public function Dados(_ref:Array) { this.meuArray = _ref addEventListener(EventoCustomizado.EVENTO_PRINCIPAL, onPush) dispatchEvent(new EventoCustomizado(EventoCustomizado.EVENTO_PRINCIPAL)); } public function onPush(e:EventoCustomizado):void { trace("Ocorreu Evento e o array foi populado") dispatchEvent(new EventoCustomizado(EventoCustomizado.ALTEROU_ARRAY)) } } } EventoCustomizado.as package eventos { import flash.events.Event; import flash.events.EventDispatcher; /** * ... * @author ... */ public class EventoCustomizado extends Event { public static const EVENTO_PRINCIPAL:String = "evento_principal"; public static const ALTEROU_ARRAY:String = "alterou_array"; public function EventoCustomizado(type:String, bubbles:Boolean = false, cancelable:Boolean = false) { super(type, bubbles, cancelable); } } } Compartilhar este post Link para o post Compartilhar em outros sites
Michel Araújo 0 Denunciar post Postado Dezembro 18, 2009 Assim, o que ocorre é que quando você instancia a classe Dados, e o evento ALTEROU_ARRAY é enviado, ainda não existe o eventListener para o objeto da classe. Fiz umas alterações aqui, que permitem que você crie o objeto da classe Dados, e então possa adicionar o listener, e então, após adicionado, você adiciona o Array ao objeto. Algo assim: Consome.as package eventos { import flash.display.MovieClip; import eventos.Dados import eventos.EventoCustomizado import flash.events.MouseEvent; /** * ... * @author ... */ public class Consome extends MovieClip { var refDados:Dados; public function Consome() { //Criei o objeto refDados = new Dados(); //adicionei o listener this.refDados.addEventListener(EventoCustomizado.ALTEROU_ARRAY, fazAlgo); //só então adicionei os dados, que irá chamar a função que dispacha o evento this.refDados.insereDados(["Lucas", "Luana", "Noelle"]); } private function fazAlgo(e:EventoCustomizado):void { trace("Em Consome " + this.refDados.meuArray) } } } Dados.as package eventos { import eventos.* import flash.display.MovieClip; /** * ... * @author ... */ public class Dados extends MovieClip { var meuArray:Array = new Array() //Construtor Vazio public function Dados(){} public function insereDados(_ref:Array):void { this.meuArray = _ref addEventListener(EventoCustomizado.EVENTO_PRINCIPAL, onPush) dispatchEvent(new EventoCustomizado(EventoCustomizado.EVENTO_PRINCIPAL)); } public function onPush(e:EventoCustomizado = null):void { trace("Ocorreu Evento e o array foi populado"); dispatchEvent(new EventoCustomizado(EventoCustomizado.ALTEROU_ARRAY)); } } } Compartilhar este post Link para o post Compartilhar em outros sites
lucasmarcal 0 Denunciar post Postado Dezembro 19, 2009 Gostaria de agradecer ao Michel Araujo e ao Eder Fortunato pela ajuda deu certo pessoal vlw.! Compartilhar este post Link para o post Compartilhar em outros sites