Как реализовать пользовательские события?
Как правильно реализовать пользовательские события? Я думал, что следующее должно работать, но я никогда не получаю CustomEvent.READY в основной модели
package mvc
{
import flash.events.Event;
public dynamic class CustomEvent extends Event
{
public static const MY_EVENT:String = "myEvent";
public static const READY:String = "ready";
public function CustomEvent(type:String)
{
super(type);
}
}
}
В Model.as, который расширяет AbstractModel, который расширяет EventDispatcher
private function initWorld():void {
_worldModel = new WorldModel();
_worldModel.addEventListener(CustomEvent.READY, update);
}
Затем в WorldModel.as, который расширяет AbstractModel, который расширяет EventDispatcher, я отправляю событие, но обновление никогда не вызывается. Зачем?
dispatchEvent(new Event(CustomEvent.READY));
2 ответа
_worldModel.dispatchEvent(new CustomEvent(CustomEvent.READY));
Вы должны создать экземпляр CustomEvent, а не Event. Большая разница.
Вы также можете использовать свое пользовательское событие для передачи дополнительных параметров вместе с отправленным событием, что очень удобно, если вы интенсивно используете CustomEvent.
package com.b99.events
{
import flash.events.Event;
/**
* ...
* @author bosworth99
*/
public class AppEvents extends Event
{
public static const APP_READY :String = "application ready";
public static const XML_LOADED :String = "XML has loaded";
public static const CHANGE_COMPLETE :String = "state change complete";
public static const PAGE_ADDED :String = "page content added";
public static const PAGE_REMOVED :String = "page content removed";
public static const LIBRARY_LOADED :String = "external library loaded";
public static const IMAGE_LOADED :String = "external image loaded";
public static const LOAD_ERROR :String = "external load failed";
public var arg:*;
public function AppEvents(type:String, bubbles:Boolean = false, cancelable:Boolean = false, ...a:*)
{
super(type, bubbles, cancelable);
arg = a;
}
override public function clone():Event
{
return new AppEvents(type, bubbles, cancelable, arg);
}
}
}
Затем вы можете передать любое количество аргументов получающей функции:
this.dispatchEvent(new AppEvents(AppEvents.LIBRARY_LOADED, false , false, _name, _library, _names));
И доступ к ним в функции получения в виде массива.
private function onLibraryLoad(e:AppEvents):void
{
_digestExternalLib.removeEventListener(AppEvents.LIBRARY_LOADED, onLibraryLoad);
var currentIndex:int = AppData.navLocations.indexOf(e.arg[0], 0);
AppData.libraries.push(e.arg[0]);
AppData.libraryCon.push(e.arg[1]);
AppData.libraryNames.push(e.arg[2]);
}
Я вытащил это из действующего проекта... но вы должны быть в состоянии собрать важные биты... Удачи!
Я действительно не вижу ничего плохого в коде. Просто для проверки попробуйте добавить этот оператор в конце метода initWorld():
_worldModel.dispatchEvent(new Event(CustomEvent.READY));
Если вызывается ваш метод update(), это будет означать, что существующий метод dispatchEvent() не вызывается.