我正在尝试调用返回XML的外部API,我也没有问题。
之后我想重构我的代码,并将API调用移到外部API.as类,但是如何将XML返回到我的主类?
离。
第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
}
}
}
第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;
}
}
}
第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 class 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????
}
}
}
希望它有点意义? 我是一名.NET开发人员,因此对于我来说,这个事件驱动的编程对我来说很新。
答案 0 :(得分:0)
你需要将_loaded变量设为public(public var loaded:XMLDocument)然后你可以做
public function GetMakes() : XMLDocument
{
return _xmlDocument.loaded;
}
虽然您可能希望为变量使用其他名称......
答案 1 :(得分:0)
您必须为加载程序提供一个回调例程,以便在收到数据后进行调用。
喜欢的东西 公共函数LoadExternal(url:String =“”,onComplete:Function)
你可以像这样使用它 new LoadExternal(URL + ApiKey,function(data:XMLDocument){_ xmlDocument = data});
答案 2 :(得分:0)
使用回调是一个相当简单的解决方案,如果你想使用事件驱动的方法,你应该从EventDispatcher继承LoadExternal和API并调度你的事件,而不是你应该在API(使用addEventListener)类中捕获它并再次发送在myCampaign中抓住它。
所以在LoadExternal和API中,这看起来像
public function onComplete(e:Event):void
{
dispatchEvent(e);
}
在myCampaign中,它将是
public function onComplete(e:Event):void
{
_loaded = new XMLDocument(e.target.data);
trace(_loaded);
}
确定您需要在APi和myCampaign中添加侦听器。
P.S。您应该避免使用XMLDocument,它只是为了与AS2向后兼容,而是使用XML。 P.P.S.使用显示列表对象需要addChild() - 您不使用任何
答案 3 :(得分:0)
我解决了这个问题!首先,我放弃了LoadExternal类。 接下来,我在API.as public中创建了Loader(URLLoader),并在myCampaign.as中的Loader上添加了EventListener
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));
}
}
}
我不知道这是不是正确的做法?有人可以证实这一点吗?