Actionscript 3.0, получить XML из внешнего класса? - PullRequest
1 голос
/ 15 февраля 2011

Я пытаюсь вызвать внешний API, который возвращает XML, и у меня нет проблем с этим.

Впоследствии я захотел провести рефакторинг своего кода и перенес мой вызов 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 голосов
/ 02 марта 2011

Я решил проблему!Сначала я отбросил класс LoadExternal.Затем я сделал Loader (URLLoader) в API.as общедоступным и добавил EventListener в Loader в 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 голосов
/ 15 февраля 2011

Вам нужно будет предоставить подпрограмму обратного вызова вашему загрузчику для вызова после получения данных.

Что-то вроде публичной функции LoadExternal (url: String = "", onComplete: Function)

И вы можете использовать его как этот новый LoadExternal (URL + ApiKey, функция (data: XMLDocument) {_ xmlDocument = data});

0 голосов
/ 15 февраля 2011

Использование обратного вызова является довольно простым решением, если вы хотите использовать подход, управляемый событиями, вы должны наследовать LoadExternal и API от EventDispatcher и отправлять ваше событие, а не перехватывать его в классе 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.

PS Следует избегать использования XMLDocument, оно сделано только для обратной совместимости с AS2, вместо этого используйте XML.PPS addChild () необходим для работы с объектами списка отображения - вы не работаете с любым

0 голосов
/ 15 февраля 2011

Вам нужно сделать переменную _loaded общедоступной (публичная переменная загружена: XMLDocument), а затем вы можете сделать

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

хотя вы можете использовать другие имена для своих переменных ...

...