Вспышка:Прослушивание всех событий определенного типа с помощью одного eventlistener
-
02-07-2019 - |
Вопрос
Это не вопрос жизни и смерти, но мне интересно, возможно ли это:
Я получил пару событий от одного типа пользовательского события (FormEvent), теперь у меня есть FormListener, который прослушивает все эти события и обрабатывает их в соответствии с типом события.Вместо того, чтобы добавлять один EventListener одновременно, я хочу добавить все события сразу.
итак, теперь это выглядит примерно так:
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;
}
}
но вместо того, чтобы добавлять каждое событие по одному за раз, я бы предпочел делать что-то вроде
private function addListeners():void {
addEventListener(FormEvent.*, formListener);
}
Интересно, возможно ли что-то подобное, мне бы это понравилось.Я работаю с множеством событий :)
Решение
В любом случае, в этом случае вам действительно нужен только один прослушиватель событий.Этот прослушиватель будет прослушивать любое изменение с помощью формы, и параметр, равный тому, каким было изменение, становится доступным для функции прослушивания событий.Я покажу вам, но, пожалуйста, помните, что это псевдоситуация, и обычно я бы не стал отправлять событие из чего-то такого простого, как вызов метода, потому что отправка подразумевается, поэтому нет реальной необходимости ее прослушивать.
Сначала пользовательское событие
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;
}
}
}
Итак, мы только что создали наш пользовательский класс событий и настроили его так, чтобы мы могли перехватывать состояние с помощью функции прослушивания, как я продемонстрирую после выполнения с псевдоклассом формы, который будет отправлять для указанного пользовательского события.
Помните, что все это гипотетично, поскольку я понятия не имею, как выглядит ваш код и как вы его реализуете.Важно заметить, что когда я отправляю событие, мне нужно отправить с ним параметр, который отражает новое состояние.
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);
}
}
}
И, наконец, мы создаем класс document, который будет его прослушивать.Пожалуйста, знайте, что я понимаю, что нелогично создавать прослушиватель, который срабатывает при вызове метода класса, потому что вы, очевидно, знаете, что вызвали метод, но для этого примера это будет необходимо.
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;
}
}
}
}
Я надеюсь, что это было полезно, уже поздно, и, возможно, позже мне придется пересмотреть некоторые вещи, но это должно помочь получить представление о том, как создавать свои собственные мероприятия и настраивать принцип работы.
Другие советы
Я не знаю ни одной программы, которая позволяла бы вам делать это напрямую, но вы могли бы написать свою собственную.Синтаксис здесь не будет идеальным, но вот первый проход:
private function addMultipleEventListeners( evts:Array, callback:function ):void
{
for each( var evt:Event in evts )
{
addEventListener( evt, callback );
}
}
Затем вы могли бы вызвать эту процедуру следующим образом:
var evts:Array = [ FormEvent.SHOW_FORM, FormEvent.SEND_FORM, FormEvent.CANCEL_FORM ];
addMultipleEventListeners( evts, formListener );