Piscar: Ouça a todos os eventos de um tipo com um eventlistener
-
02-07-2019 - |
Pergunta
Não é uma questão de vida ou morte, mas eu me pergunto se isso poderia ser possível:
Eu tenho um par de eventos de um tipo de evento personalizado (FormEvent) agora eu tenho uma FormListener que escutas a todos aqueles eventos e alças los de acordo com o tipo de evento. Em vez de adicionar um eventListener no momento eu gostaria de adicionar todos os eventos de uma só vez.
então agora é parecido com este:
private function addListeners():void {
addEventListener(FormEvent.SHOW_FORM, formListener);
addEventListener(FormEvent.SEND_FORM, formListener);
addEventListener(FormEvent.CANCEL_FORM, formListener);
}
private function formListener(event:formEvent):void {
switch(event.type){
case "show.form":
// handle show form stuff
break;
case "send.form":
// handle send form stuff
break;
case "cancel.form":
// handle cancel form stuff
break;
}
}
mas em vez de adicionar cada um evento no momento em que eu preferiria estar fazendo algo como
private function addListeners():void {
addEventListener(FormEvent.*, formListener);
}
Gostaria de saber se algo como isso é possível, eu iria adorar. Eu trabalho com cargas de eventos:)
Solução
Você realmente só precisa de um ouvinte de evento, neste caso, de qualquer maneira. Esse ouvinte será ouvir para qualquer mudança com a forma e um parâmetro igual ao que a mudança foi se torna disponível para a função de evento ouvinte. Eu vou te mostrar, mas lembre-se que esta é uma situação pseudo e normalmente eu não iria despachar um evento fora de algo tão simples como uma chamada de método porque a expedição está implícito por isso não há necessidade real de ouvir para ele.
Primeiro, o evento personalizado
package com.yourDomain.events
{
import flash.events.Event;
public class FormEvent extends Event
{
//Public Properties
public static const CANCEL_FORM:int = "0";
public static const SHOW_FORM:int = "1";
public static const SEND_FORM:int = "2";
public static const STATE_CHANGED:String = "stateChanged";
//Private Properties
private var formState:int;
public function FormEvent(formState:int):void
{
super(STATE_CHANGED);
formState = formState;
}
}
}
Assim que acabamos de criar nossa classe evento personalizado e nós configurá-lo para que possamos pegar o estado através da função de ouvinte como vou demonstrar, uma vez feito com a classe de formulário pseudo que irá despachar o para o referido evento personalizado.
Lembre-se que isto é tudo hipotético como eu não tenho idéia do que sua aparência código como ou como as coisas execução. O que é importante é notar que quando eu despachar o evento eu preciso enviar um parâmetro com ele que reflete o que o novo estado é.
package com.yourDomain.ui
{
import flash.events.Event;
import flash.events.EventDispatcher;
import com.yourDomain.events.FormEvent;
public class Form extends EventDispatcher
{
public function Form():void
{
//Anything you want form to do upon instantiation goes here.
}
public function cancelForm():void
{
dispatchEvent(new Event(FormEvent.CANCEL_FORM);
}
public function showForm():void
{
dispatchEvent(new Event(FormEvent.SHOW_FORM);
}
public function sendForm():void
{
dispatchEvent(new Event(FormEvent.SEND_FORM);
}
}
}
E, finalmente, criar a classe do documento que vai ouvir para ele. Por favor, saibam que eu percebo que não é lógico para criar um ouvinte que é acionado quando você chamar um método de uma classe porque obviamente você sabe que você chamou o método, mas para este exemplo, será devido.
package com.yourDomain.ui
{
import com.yourDomain.ui.Form;
import com.yourDomain.events.FormEvent;
//Form is in the same package so we need not import it.
public class MainDocumentClass
{
private var _theForm:Form;
public function MainDocumentClass():void
{
_theForm = new Form();
_theForm.addEventListener(FormEvent.STATE_CHANGED, onFormStateChange, false, 0, true);
/*
The following three method calls each cause the
FormEvent.STATE_CHANGE event to be dispatched.
onFormStateChange is notified and checks what
the last change actually was.
*/
_theForm.cancelForm();
_theForm.showForm();
_theForm.sendForm();
}
private function onFormStateChange(e:FormEvent):void
{
switch(e.formState)
{
case CANCEL_FORM:
trace('The form was canceled');
break;
case SHOW_FORM:
trace('The form was revealed');
break;
case SEND_FORM:
trace('The form was sent');
break;
}
}
}
}
Espero que isso foi útil, que seja tarde e eu pode ter de rever algumas coisas mais tarde, mas isso deve ajudar a obter um entendimento de como fazer seus próprios eventos e para personalizar a forma como as coisas funcionam.
Outras dicas
Eu não sei de nenhum rotinas que permitem fazer isso diretamente, mas você pode escrever seu próprio. A sintaxe aqui não será perfeito, mas aqui está uma primeira passagem:
private function addMultipleEventListeners( evts:Array, callback:function ):void
{
for each( var evt:Event in evts )
{
addEventListener( evt, callback );
}
}
Você pode então chamar essa rotina assim:
var evts:Array = [ FormEvent.SHOW_FORM, FormEvent.SEND_FORM, FormEvent.CANCEL_FORM ];
addMultipleEventListeners( evts, formListener );