Actionscript 3.0, Get xml from external class?
I'm trying to call an external API which returns XML, and i have no problem doing that.
Afterwards I wanted to refactor my code, and I moved my API call to an external API.as class, but how do i return the XML to my main class??
ex.
class 1:
package references.campaign
{
import flash.events.Event;
import flash.xml.XMLDocument;
import references.utils.*;
import flash.display.*;
public class myCampaign extends MovieClip
{
public function myCampaign()
{
var api = new API();
trace(api.GetMakes()); //I would like this to show XML output
}
}
}
class 2:
package references.utils
{
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLLoaderDataFormat;
import flash.xml.XMLDocument;
public class API
{
const ApiKey:String = "ApiKEY=random_gen_key";
const URL:String = "http://api.myURL.com/";
private var _xmlDocument:XMLDocument;
public function API()
{
_xmlDocument = new LoadExternal(URL + ApiKey);
}
public function GetMakes() : XMLDocument
{
return _xmlDocument;
}
}
}
class 3:
package references.utils
{
import flash.display.Loader;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLLoaderDataFormat;
import flash.xml.XMLDocument;
public cl开发者_StackOverflow中文版ass LoadExternal
{
private var _url:String = "";
private var _bytesLoadProgress:int = 0;
private var _loaded:XMLDocument;
public function LoadExternal(url:String = "")
{
if (url != "")
{
loader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.TEXT;
loader.addEventListener(Event.COMPLETE, onComplete);
loader.load(new URLRequest(url));
}
}
public function onComplete(e:Event):void
{
_loaded = new XMLDocument(e.target.data);
trace(_loaded); //This works, but not what i'm after.
this.addChild(_loaded); // something like this????
}
}
}
Hope it makes a little sense?? I'm a .NET developer, so it's new to me with this event-driven programming..
You need to make the _loaded variable public (public var loaded:XMLDocument) and then you can do
public function GetMakes() : XMLDocument
{
return _xmlDocument.loaded;
}
although you might want to use other names for your variables...
You will have to provide a callback routine to your loader to call once the data is received.
Something like public function LoadExternal(url:String = "", onComplete: Function)
And you can use it like this new LoadExternal(URL + ApiKey, function (data:XMLDocument){_xmlDocument = data});
Using callback is a rather straightforward solution, if you want to use event-driven approach you should inherit LoadExternal and API from EventDispatcher and dispatch your event, than you should catch it in API (with addEventListener) class and dispatch again and finally catch it in myCampaign.
So in LoadExternal and API this will look like
public function onComplete(e:Event):void
{
dispatchEvent(e);
}
And in myCampaign it will be
public function onComplete(e:Event):void
{
_loaded = new XMLDocument(e.target.data);
trace(_loaded);
}
And sure you will need to add listeners in APi and myCampaign.
P.S. You should avoid using XMLDocument it is made only for backward compatability with AS2, use XML instead. P.P.S. addChild() is needed to work with display list objects - you are not working with any
I solved the problem! First i discarded the LoadExternal class. Next I made the Loader(URLLoader) in API.as public, and added EventListener on Loader in myCampaign.as
package references.campaign
{
import flash.events.Event;
import references.utils.*;
import flash.display.*;
import flash.net.*;
public class myCampaign extends MovieClip
{
public function myCampaign()
{
var api = new API();
api.InvokeMethod("MyMethod");
api.Loader.addEventListener(Event.COMPLETE, MethodLoaded);
}
function MethodLoaded(e:Event)
{
var array:Array = new Array();
var xml:XML = new XML(e.target.data);
trace(xml);
}
}
}
package references.utils
{
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLLoaderDataFormat;
public class API
{
const ApiKey:String = "ApiKEY=random_gen_key";
const URL:String = "http://api.myURL.com/";
public var Loader:URLLoader;
public function API()
{
}
public function InvokeMethod(method:String) : void
{
Loader = new URLLoader();
Loader.dataFormat = URLLoaderDataFormat.TEXT;
Loader.load(new URLRequest(URL + method + "?" + ApiKey));
}
}
}
I don't know if this is the right approach? Can someone confirm this?
精彩评论