Ir para conteúdo

Arquivado

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

lucasmarcal

[Resolvido] Problemas com eventos customizados no AS3

Recommended Posts

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

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

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

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

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

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

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

×

Informação importante

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