Flash AS3从事件侦听器函数返回变量
我试图将XML从事件完成返回到主函数,但不知道如何执行 以下是我调用的函数: 主文件:Flash AS3从事件侦听器函数返回变量,flash,actionscript-3,flash-cs5,Flash,Actionscript 3,Flash Cs5,我试图将XML从事件完成返回到主函数,但不知道如何执行 以下是我调用的函数: 主文件: public var mySendAndLoad:SendAndLoad = new SendAndLoad(); mySendAndLoad.sendData(url,variables) mySendAndLoad类: package { import flash.events.*; import flash.net.*; import flash.xml.XMLDocu
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)的事件中没有它,因此它不会被带回
有什么想法吗?如果不进行重大修改,您有两种选择:
SaveAndLoad
类将驱动EventDispatcher并发送一个包含数据的自定义事件sendData
方法修改:
public function sendData(url:String, _vars:URLVariables, resultHandler:Function=null):String
{
loader.addEventListener(Event.COMPLETE, resultHandler);
}
您可以传递在主文件中定义的函数,仍然能够在
SaveAndLoad
类中为您想要的任何内容附加内部侦听器,并且您将拥有您的数据。如果不进行严重修改,您有两个选项:
SaveAndLoad
类将驱动EventDispatcher并发送一个包含数据的自定义事件sendData
方法修改:
public function sendData(url:String, _vars:URLVariables, resultHandler:Function=null):String
{
loader.addEventListener(Event.COMPLETE, resultHandler);
}
SaveAndLoad
类中为您想要的任何内容附加内部侦听器,并且您将拥有数据。只需分派一个事件即可
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);
}
只需发送一个事件
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);
}
}
在主文件中
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
}
}
在主文件中
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
}
您必须使用
dispatchEvent
首先向它申报
public class personal_info extends EventDispatcher { }
您必须将listener定义到该类中
dispatchEvent(new Event(Event.COMPLETE));
您必须使用
dispatchEvent
首先向它申报
public class personal_info extends EventDispatcher { }
您必须将listener定义到该类中
dispatchEvent(new Event(Event.COMPLETE));
我明白你的意思,但是我应该在主文件中放什么呢?在主文件中定义一个函数:private function handleLoadComplete(event:event):void{},当调用mySendAndLoad.sendData(url,variables)时,只需调用mySendAndLoad.sendData(url,variables,handleLoadComplete)。您将侦听器附加到加载程序,其处理程序是对主文件中定义的函数的引用。我明白您的意思,但我将在主文件中放置什么?在主文件中,您定义了一个函数:private function handleLoadComplete(event:event):void{}和调用mySendAndLoad.sendData(url,变量)您只需调用mySendAndLoad.sendData(url、变量、handleLoadComplete)。您将一个侦听器附加到加载程序,其处理程序引用主文件中定义的函数。相反,您可以使用此.dispatchEvent(事件);现在在创建对象var sender的主类中:SendAndLoad=newsendandload();您将添加一个事件侦听器。sender.addEventListener(Event.COMPLETE,myXMLLoaded);在函数myxmloaded中,您现在可以访问分配给sender.xml的var上的数据。这有帮助吗?如果您仍然不明白,我需要您编辑您的问题,并在创建SendAndLoad对象的地方发布代码。即使我们不知道类SaveAndLoad不是派生的EventDispatcher(也称为无法调度事件),此技术不起作用,因为在重新分派事件后,事件的
目标将不是加载器,而是SaveAndLoad intance。我得到了一个“undefined method dispatchEvent through static type SendAndLoad”错误。正如我发布的代码所示,return语句被注释掉了。相反,您可以使用此.dispatchEvent(事件);现在在创建对象var sender的主类中:SendAndLoad=newsendandload();您将添加一个事件侦听器。sender.addEventListener(Event.COMPLETE,myXMLLoaded);在函数myxmloaded中,您现在可以访问分配给sender.xml的var上的数据。这有帮助吗?如果您仍然不明白,我需要您编辑您的问题,并在创建SendAndLoad对象的地方发布代码。即使我们不知道类SaveAndLoad不是派生的EventDispatcher(也称为无法调度事件),此技术不起作用,因为在重新分派事件后,事件的目标将不是加载程序,而是SaveAndLoad intance。我得到了一个“undefined method dispatchEvent through static type SendAndLoad”错误。您好,我刚刚尝试在我自己的项目中使用此代码。但是,Flash报告了公共函数sendData的一个错误,表示它没有返回值。我尝试将函数设置为:void,但它仍然显示相同的错误。有什么帮助吗?Thanks@MrPablo哇,真不敢相信这么长时间没人发现那个错误。我已经编辑了答案(将函数更改为void),它工作正常。我建议你清理这个项目(如果你使用的是Flash Builder),或者重新启动Flash Pro,然后重试。是的,我在发表我的评论后不久就明白了!嗨,我刚刚尝试在我自己的项目中使用这段代码。但是,Flash报告了公共函数sendData的一个错误,表示它没有返回值。我尝试将函数设置为:void,但它仍然显示相同的错误。有什么帮助吗?Thanks@MrPablo哇,真不敢相信这么长时间没人发现那个错误。我已经编辑了答案(将函数更改为void),它工作正常。我建议你清理这个项目(如果你使用的是Flash Builder),或者重新启动Flash Pro,然后重试。是的,我在发表我的评论后不久就明白了!