2011-02-15 74 views
1

我想调用一个返回XML的外部API,并且我没有这个问题。Actionscript 3.0,从外部类获取xml?

后来我想重构我的代码,并将我的API调用移动到外部API.as类,但是如何将XML返回到我的主类?

ex。

类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

我解决了这个问题!首先我放弃了LoadExternal类。 接下来我做的API.as公众装载机(的URLLoader),并在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)); 
     } 
    } 
} 

我不知道这是否是正确的方法添加事件监听装载机?有人能证实这一点吗?

0

你需要让_loaded变量公共(公共变种加载:为XMLDocument),然后你可以做

public function GetMakes() : XMLDocument 
{  
    return _xmlDocument.loaded; 
} 

虽然你可能想使用其他名字的变量...

+0

这没有奏效,它只是返回null。这个事件在这一点上没有提出。 – Finnbogi 2011-02-16 08:44:25

+0

这可能是因为加载尚未完成。你可以派遣另一个完整的事件,并在mycampaign类中听...由于Pavel S已经建议.. – ThomasM 2011-02-16 09:57:46

+0

我通过公开我的“Loader”来解决问题。 我会将代码作为新评论发布 – Finnbogi 2011-03-02 09:10:11

0

你必须提供一个回调函数,您的装载机一旦接收到数据调用。

喜欢的东西 公共职能LoadExternal(网址:字符串= “” 的onComplete:功能)

而且你可以使用它像这样 新LoadExternal(URL + ApiKey,功能(数据:为XMLDocument){_ XMLDOCUMENT =数据});

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); 
} 

而且相信你会需要在AP i和myCampaign添加监听器。

P.S.你应该避免使用XMLDocument,它只是为了与AS2向后兼容,而不是使用XML。 P.P.S. addChild()需要与显示列表对象一起工作 - 你没有与任何工作