2011-02-15 84 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()需要與顯示列表對象一起工作 - 你沒有與任何工作