Reputation: 709
I'm trying to return XML from an event complete back to the main function, but can't figure out how to do it.
Here's the functions I'm calling:
Main File:
public var mySendAndLoad:SendAndLoad = new SendAndLoad();
mySendAndLoad.sendData(url,variables)
The mySendAndLoad class:
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.");
}
}
}
What I want to happen is have the xmlList come back to the main file. But since it isn't in the event I called (sendData) it doesn't get brought back.
Any ideas?
Upvotes: 1
Views: 4120
Reputation: 293
You must use dispatchEvent
;
first declare to it
public class personal_info extends EventDispatcher { }
and you must define listener into that class
dispatchEvent(new Event(Event.COMPLETE));
Upvotes: 0
Reputation: 293
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);
}
Upvotes: 0
Reputation: 25489
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.");
}
}
}
and in the main file
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
}
Upvotes: 1
Reputation: 141
Without serious modifications you have two options:
Your SaveAndLoad
class to derrive EventDispatcher and send a custom event with the data in it.
More clean/non obtrusive is to make sendData
method modifications:
public function sendData(url:String, _vars:URLVariables, resultHandler:Function=null):String
{
loader.addEventListener(Event.COMPLETE, resultHandler);
}
You can pass a function defined in your main file, still have the ability to attach inner listeners for whatever you want in SaveAndLoad
class, and you will have your data.
Upvotes: 0
Reputation: 6402
Just dispatch an event
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);
}
Upvotes: 0