jidijkstra
%Europe/Berlin %697 %2007, 17:44
In mijn project heb ik wat problemen om een event op te laten vangen door de stage...
Er zijn twee klassen: een XML loader klasse LocationDB (die nog wat andere functies vervult) en een EventDispatcher DBEvent die een custom event dispatcht. Deze worden beiden op de stage gebruikt. Er wordt een nieuw LocationDB-object aangemaakt waardoor er een XML wordt ingeladen in die klasse. Als deze is ingeladen wordt er een custom event (DBEvent.XMLLOADED) gedispatcht (?) uit de DBEvent dispatcher, die opgevangen moet worden door de stage. Als ik daar een eventlistener maak voor het betreffende event wordt die functie (doAction) alleen uitgevoerd als ik het event vanaf de stage dispatch. Als ik het event door de LocationDB laat dispatchen wordt het event wel afgevuurd (de trace uit die functie zie ik onstaan, in dit geval "constructor triggered") maar wordt niet door de eventListener opgevangen. Waar heeft dat mee te maken? En hoe los ik dat op? Want na een dag zelf puzzelen, zoeken en frustraties zou ik ERG graag het antwoord een keer weten :P
Thanks vast,
De LocationDB-klasse (waar wat voor dit verhaal overbodige regels zijn verwijderd):
package {
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.events.*;
import flash.net.*;
public class LocationDB extends EventDispatcher{
public var xmlDB:XML;
public var xmlDBLoader:URLLoader = new URLLoader();
public function LocationDB(file:String) {
xmlDBLoader.addEventListener(Event.COMPLETE, buildObjectArray);
loadDB(file);
}
public function loadDB(file:String):void {
xmlDBLoader.load(new URLRequest(file));
}
public function buildObjectArray(e:Event = null):void {
dispatchEvent(new DBEvent(DBEvent.XMLLOADED));
var count:int;
//hier gebeuren nog wat andere zaken (waaronder het bouwen van een array)
}
}
}
En de DBEvent dispatcher
package {
import flash.events.Event;
public class DBEvent extends Event {
public static const XMLLOADED:String = "xmlloaded";
public function DBEvent(type:String):void{
trace("constructor triggered: " + type);
super(type, true, false);
}
public override function clone():Event {
return new DBEvent(type);
}
}
}
Voor de volledigeheid ook nog de actionscript die ik op de main timeline van een fla bestand heb gezet:
import LocationDB;
stage.addEventListener(DBEvent.XMLLOADED, doAction);
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
function keyPressed(e:KeyboardEvent):void {
if(e.keyCode == 49) {
var dBase:LocationDB = new LocationDB("xml/locationdb.xml");
trace (dBase);
}
if(e.keyCode == 50) {
dispatchEvent(new DBEvent(DBEvent.XMLLOADED));
}
}
function doAction(e:Event):void {
trace("doAction triggered, event: " + e);
}
Er zijn twee klassen: een XML loader klasse LocationDB (die nog wat andere functies vervult) en een EventDispatcher DBEvent die een custom event dispatcht. Deze worden beiden op de stage gebruikt. Er wordt een nieuw LocationDB-object aangemaakt waardoor er een XML wordt ingeladen in die klasse. Als deze is ingeladen wordt er een custom event (DBEvent.XMLLOADED) gedispatcht (?) uit de DBEvent dispatcher, die opgevangen moet worden door de stage. Als ik daar een eventlistener maak voor het betreffende event wordt die functie (doAction) alleen uitgevoerd als ik het event vanaf de stage dispatch. Als ik het event door de LocationDB laat dispatchen wordt het event wel afgevuurd (de trace uit die functie zie ik onstaan, in dit geval "constructor triggered") maar wordt niet door de eventListener opgevangen. Waar heeft dat mee te maken? En hoe los ik dat op? Want na een dag zelf puzzelen, zoeken en frustraties zou ik ERG graag het antwoord een keer weten :P
Thanks vast,
De LocationDB-klasse (waar wat voor dit verhaal overbodige regels zijn verwijderd):
package {
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.events.*;
import flash.net.*;
public class LocationDB extends EventDispatcher{
public var xmlDB:XML;
public var xmlDBLoader:URLLoader = new URLLoader();
public function LocationDB(file:String) {
xmlDBLoader.addEventListener(Event.COMPLETE, buildObjectArray);
loadDB(file);
}
public function loadDB(file:String):void {
xmlDBLoader.load(new URLRequest(file));
}
public function buildObjectArray(e:Event = null):void {
dispatchEvent(new DBEvent(DBEvent.XMLLOADED));
var count:int;
//hier gebeuren nog wat andere zaken (waaronder het bouwen van een array)
}
}
}
En de DBEvent dispatcher
package {
import flash.events.Event;
public class DBEvent extends Event {
public static const XMLLOADED:String = "xmlloaded";
public function DBEvent(type:String):void{
trace("constructor triggered: " + type);
super(type, true, false);
}
public override function clone():Event {
return new DBEvent(type);
}
}
}
Voor de volledigeheid ook nog de actionscript die ik op de main timeline van een fla bestand heb gezet:
import LocationDB;
stage.addEventListener(DBEvent.XMLLOADED, doAction);
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
function keyPressed(e:KeyboardEvent):void {
if(e.keyCode == 49) {
var dBase:LocationDB = new LocationDB("xml/locationdb.xml");
trace (dBase);
}
if(e.keyCode == 50) {
dispatchEvent(new DBEvent(DBEvent.XMLLOADED));
}
}
function doAction(e:Event):void {
trace("doAction triggered, event: " + e);
}