Actionscript 3.0,从外部类获取xml?

时间:2011-02-15 14:38:20

标签: xml flash actionscript-3 design-patterns actionscript

我正在尝试调用返回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开发人员,因此对于我来说,这个事件驱动的编程对我来说很新。

4 个答案:

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

我不知道这是不是正确的做法?有人可以证实这一点吗?