2011-09-28 117 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); 
}