2011-09-28 122 views
1

我试图从一个事件返回XML返回主函数,但无法弄清楚如何去做。AS3从事件侦听器函数返回一个变量

这里是我打电话的功能:

主文件:

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)的情况下,它不会被带回。

任何想法?

回答

1
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

嗨,我刚刚尝试在我自己的项目中使用此代码。但是,Flash会报告公用函数sendData的错误,并说它不返回值。我试着将函数设置为:void,但它仍然表示相同的错误。对此有何帮助?谢谢 –

+0

@MrPablo,哇,我不敢相信这么长时间没有人发现这个错误。我已经编辑了答案(将函数更改为void)并且它可以正常工作。我建议你清理这个项目(如果你使用的是Flash Builder)或者重新启动Flash Pro并重试 –

+0

是的,我在发表我的评论后不久就明白了! –

0

没有认真修改你有两种选择:

  1. SaveAndLoad类此事件derrive并与它的数据发送自定义事件。

  2. 更干净/不突兀是让sendData法修改:

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

您可以通过在你的主文件中定义的功能,还具有附加内监听任何你想要的能力在SaveAndLoad类,你会有你的数据。

+0

我明白你说的是什么,但是我会把什么放在主文件中?在你的主文件定义一个函数 – adamzwakk

+0

: 私有函数handleLoadComplete(事件:事件):无效 { } 并要求你对你的mySendAndLoad.sendData(URL,变量) 时,你只需要调用mySendAndLoad.sendData(URL,变量,handleLoadComplete)。 您将一个侦听器附加到加载器,其处理程序引用您在主文件中定义的函数。 –

0

只是分派事件

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

不太确定你的意思 – adamzwakk

+0

正如你在我的发布代码中看到的那样,返回语句被注释掉了。相反,你this.dispatchEvent(事件);现在在创建对象var sender的主类中:SendAndLoad = new SendAndLoad(); 你将添加一个事件监听器。sender.addEventListener(Event.COMPLETE,myXMLLoaded); 在函数myXMLLoaded中,您现在可以访问您将其分配给sender.xml的var上的数据。这有帮助吗? –

+0

如果您仍然不明白,我将需要您编辑您的问题,并在您创建SendAndLoad对象的位置发布代码。 –

0

必须使用dispatchEvent;

首先声明它 公共类的personal_info扩展EventDispatcher {

,你必须定义监听到该类 dispatchEvent(新事件(Event.COMPLETE));

0
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); 
}