AS3 Возвращение переменной из функции прослушивателя событий - PullRequest
1 голос
/ 28 сентября 2011

Я пытаюсь вернуть XML из события завершения обратно в основную функцию, но не могу понять, как это сделать.

Вот функции, которые я вызываю:

Основной файл:

public var mySendAndLoad:SendAndLoad = new SendAndLoad(); 

mySendAndLoad.sendData(url,variables)

Класс mySendAndLoad:

package 
{

    import flash.events.*;
    import flash.net.*;
    import flash.xml.XMLDocument;

    public class SendAndLoad
    {
        public var xml:XML = new XML();
        public var xmlList:XMLList;

        public function SendAndLoad()
        {
        }
        public function sendData(url:String, _vars:URLVariables):String
        {
            var request:URLRequest = new URLRequest(url);
            var loader:URLLoader = new URLLoader();
            loader.dataFormat = URLLoaderDataFormat.TEXT;
            request.data = _vars;
            request.method = URLRequestMethod.POST;
            loader.addEventListener(Event.COMPLETE, handleComplete);
            loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
            loader.load(request);
        }
        private function handleComplete(event:Event):String
        {
            var loader:URLLoader = URLLoader(event.target);
            xml = XML(loader.data);
            xmlList = xml.children();
            return(xmlList[1]);
        }
        private function onIOError(event:IOErrorEvent):void
        {
            trace("Error loading URL.");
        }
    }
}

Я хочу, чтобы xmlList вернулся в основной файл.Но поскольку это происходит не в том случае, если я вызвал (sendData), оно не возвращается.

Есть идеи?

Ответы [ 5 ]

1 голос
/ 04 октября 2011
package 
{

import flash.events.*;
import flash.net.*;
import flash.xml.XMLDocument;

//THIS CLASS EXTENDS EVENTDISPATCHER SO IT CAN DISPATCH EVENTS
public class SendAndLoad extends EventDispatcher
{
    public var xml:XML = new XML();
    public var xmlList:XMLList;

    public function SendAndLoad()
    {
        super(null);
    }
    public function sendData(url:String, _vars:URLVariables):void
    {
        var request:URLRequest = new URLRequest(url);
        var loader:URLLoader = new URLLoader();
        loader.dataFormat = URLLoaderDataFormat.TEXT;
        request.data = _vars;
        request.method = URLRequestMethod.POST;
        loader.addEventListener(Event.COMPLETE, handleComplete);
        loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
        loader.load(request);
    }
    private function handleComplete(event:Event):void
    {
        var loader:URLLoader = URLLoader(event.target);
        xml = XML(loader.data);
        xmlList = xml.children();


        //NEW CODE
        var evt:Event=new Event(Event.COMPLETE);
        dispatchEvent(evt);
        //return(xmlList[1]);
    }
    private function onIOError(event:IOErrorEvent):void
    {
        trace("Error loading URL.");
    }
}

}

и в основном файле

public var mySendAndLoad:SendAndLoad = new SendAndLoad(); 
mySendAndLoad.addEventListener(Event.COMPLETE, xmlLoadCompleted);
mySendAndLoad.sendData(url,variables)

private function xmlLoadCompleted(e:Event):void {
    var childToUse:XML=mySendAndLoad.xmlList[1];
    //whatever else you want to do 
}
0 голосов
/ 20 сентября 2013
you must declare variable such as public
public var variable:String;

You must use dispatchEvent;

first declare to it
   public class personal_info extends EventDispatcher {
   ...

and you must define listener into that complete event
   variable = "variable";
   dispatchEvent(new Event(Event.COMPLETE));
   ...

And you must call just like calling normal event in another class
   var sample:SampleClass = new SampleClass ();
   sample.addEventListener(Event.COMPLETE , cComplete);

And you can use that variable in this class like:
  private fonction (e:Event):void {
    trace (e.target.variable);
}
0 голосов
/ 20 сентября 2013

Вы должны использовать dispatchEvent;

сначала объявите об этом открытый класс personal_info расширяет EventDispatcher {

и вы должны определить слушателя в этом классе dispatchEvent (new Event (Event.COMPLETE));

0 голосов
/ 28 сентября 2011

Просто отправьте событие

package 
{

    import flash.events.Event;
    import flash.display.Sprite;
    import flash.events.*;
    import flash.net.*;
    import flash.xml.XMLDocument;

    public class SendAndLoad extend Sprite
    {
        public var xml:XML = new XML();
        public var xmlList:XMLList;

        public function SendAndLoad()
        {
        }
        public function sendData(url:String, _vars:URLVariables):String
        {
            var request:URLRequest = new URLRequest(url);
            var loader:URLLoader = new URLLoader();
            loader.dataFormat = URLLoaderDataFormat.TEXT;
            request.data = _vars;
            request.method = URLRequestMethod.POST;
            loader.addEventListener(Event.COMPLETE, handleComplete);
            loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
            loader.load(request);
        }
        private function handleComplete(event:Event):String
        {
            var loader:URLLoader = URLLoader(event.target);
            xml = XML(loader.data);
            xmlList = xml.children();


           // return(xmlList[1]);
           this.dispatchEvent( new Event( 'ONDATA' ) );
        }
        private function onIOError(event:IOErrorEvent):void
        {
            trace("Error loading URL.");
        }
    }
}


// usage
var sender:SendAndLoad = new SendAndLoad( );
sender.addEventListener( 'ONDATA', myXMLLoaded);
sender.sendData( url, _vars )

function myXMLLoaded( e:Event ):void{
  trace(sender.xml);
}
0 голосов
/ 28 сентября 2011

Без серьезных изменений у вас есть два варианта:

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

  2. Более чистым / не навязчивым является внесение sendData модификаций метода:

    public function sendData(url:String, _vars:URLVariables, resultHandler:Function=null):String
    {
        loader.addEventListener(Event.COMPLETE, resultHandler);
    }
    

Вы можете передать функцию, определенную в вашем основном файле, но при этом иметь возможность прикрепитьвнутренние слушатели того, что вы хотите в SaveAndLoad классе, и у вас будут ваши данные.

...