Диспетчеризация пользовательских событий
Я пытаюсь запустить событие из подкласса, у меня есть 3 класса; EventHandler, MainClass, SubClass
EventHandler.as
public class EventHandler extends Event
{
public static const TEST_EVENT:String = "Test";
public function EventHandler($type:String, $params:Object, $bubbles:Boolean = false, $cancelable:Boolean = false)
{
super($type,$params, $bubbles, $cancelable);
this.params = $params;
}
public override function clone():Event
{
return new EventHandler(type, this.params, bubbles, cancelable);
}
}
MainClass.as
public function MainClass()
{
addEventListener(EventHandler.TEST_EVENT, testFunc);
}
private function testFunc(e:EventHandler){
trace("OK");
}
SubClass.as
private function CustomFunction(event:MouseEvent):void {
dispatchEvent(new EventHandler(EventHandler.TEST_EVENT,customObject));
}
Я получаю VerifyError: Ошибка № 1063: flash.events::Event() Что не так с моим архитектором? Спасибо!
2 ответа
Решение
Удалить $params
от super($type,$params, $bubbles, $cancelable);
Как это:
public class EventHandler extends Event
{
public static const TEST_EVENT:String = "Test";
public function EventHandler($type:String, $params:Object, $bubbles:Boolean = false, $cancelable:Boolean = false)
{
super($type, $bubbles, $cancelable);
this.params = $params;
}
public var params:Object;
public override function clone():Event
{
return new EventHandler(type, this.params, bubbles, cancelable);
}
}
Определите пользовательское событие как:
package com.mysite.events
{
import flash.events.Event;
public class PendingEvent extends Event
{
public var payload:Object = {};
public static const CONTENT_COMPLETE:String = "contentComplete";
public function PendingEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
}
public override function clone():Event
{
return new PendingEvent(type, bubbles, cancelable);
}
}
}
В другом месте отправка, как:
var event:PendingEvent = new PendingEvent(PendingEvent.CONTENT_COMPLETE);
event.payload.someStuff = "stuff";
event.payload.moreStuff = "moreStuff"
dispatchEvent(event);
Тогда послушайте это где-нибудь еще:
this.component.addEventListener(PendingEvent.CONTENT_COMPLETE, componentContentComplete);
private function componentContentComplete(event:PendingEvent):void
{
// remove listener
this.component.removeEventListener(PendingEvent.CONTENT_COMPLETE, componentContentComplete);
// do something useful with payload
var payload:Object = event.payload;
trace(payload.someStuff); // stuff
trace(payload.moreStuff); // moreStuff
}
РЕДАКТИРОВАТЬ:
Обвиульсы ты бы не использовал Object
для вашей полезной нагрузки создайте другой типизированный класс по вашему выбору и вместо этого установите реквизиты для этого объекта, но вы поняли идею.