2011-12-04 21 views
1

我在我的事件處理函數(函數執行期間)中爲我的xml對象(xml = new XML(e.currentTarget.data);)設置了一個值在event.COMPLETE之後),如果我跟蹤事件函數處理程序中的對象,它會顯示我的xml數據。Actionscript 3 - 如何在移除該事件後保留事件的值

但如果我嘗試在事件處理程序函數之外追蹤它,它不會顯示我的xml內容。沒有辦法讓我的xml對象內容值顯示在其他函數中,但不是在事件處理函數中顯示?

private var xml:XML; 

public function XMLLoader(xmlURL:String) 
{ 
    var xmlURLRequest:URLRequest = new URLRequest(xmlURL); 
    var xmlURLLoader:URLLoader = new URLLoader(xmlURLRequest); 
    xmlURLLoader.addEventListener(Event.COMPLETE, xmlData); 
} 

private function xmlData(e:Event):void 
{ 
    e.currentTarget.removeEventListener(Event.COMPLETE, xmlData); 
    xml = new XML(e.currentTarget.data); 
    dispatchEvent(new Event(Event.COMPLETE)); 
    trace(xml); 
} 

public function getXMLData():void 
{ 
    //I've find out that this shows null because this function is faster 
    //what do i do? put an event.complete in every following function? 
    trace(xml); 
} 

謝謝。

+0

private var xml:XML; \t \t公共函數XMLLoader(XMLURL:字符串){ \t \t \t VAR xmlURLRequest \t:的URLRequest \t =新的URLRequest(XMLURL); \t \t \t var xmlURLLoader \t:URLLoader \t = new URLLoader(xmlURLRequest); \t \t \t \t \t \t xmlURLLoader.addEventListener(Event.COMPLETE,XMLDATA); \t \t} \t \t \t 私人\t功能XMLDATA(E:事件):無效{ \t \t \t e.currentTarget.removeEventListener(Event.COMPLETE,XMLDATA); \t \t \t \t \t \t xml = new XML(e.currentTarget.data); \t \t \t \t \t \t dispatchEvent(new Event(Event.COMPLETE)); \t \t \t trace(xml); \t \t} \t \t \t 公共\t功能getXMLData():無效{ \t \t \t跟蹤(XML); \t \t} – bunnyannihilator89

+0

你可能會發布代碼,你安裝'XMLLoader'並調用'getXMLData()'方法嗎? –

+0

public class XMLLoader extends EventDispatcher {\t \t private var xml:XML; \t公用函數XMLLoader(xmlURL:String){0} {0} {0} {0}} var xmlURLRequest:URLRequest = new URLRequest(xmlURL); \t \t var xmlURLLoader:URLLoader = new URLLoader(xmlURLRequest); \t xmlURLLoader.addEventListener(Event.COMPLETE,xmlData); \t \t} \t \t私有函數XMLDATA(E:事件):無效{ \t \t e.currentTarget.removeEventListener(Event.COMPLETE,XMLDATA); \t \t xml = new XML(e.currentTarget.data); \t \t dispatchEvent(new Event(Event.COMPLETE)); \t \t跟蹤(XML); //這一個顯示 \t \t} \t \t公共函數getXMLData():XML { \t \t \t跟蹤(XML); //這個不顯示 \t \t} \t} – bunnyannihilator89

回答

0

//注意:使用這個,如果你想這個「類」的功能直接訪問而無需使用任何事件偵聽器的類原因它已經擁有它的事件每個函數上的LISTENER(這會導致僅有一個函數getXMLData())

private var xml:XML;

公共職能XMLLoader(美語字符串) {

 var xmlURLRequest:URLRequest = new URLRequest(xmlURL); 
    var xmlURLLoader:URLLoader = new URLLoader(xmlURLRequest); 
    xmlURLLoader.addEventListener(Event.COMPLETE, xmlData); 

}

私有函數XMLDATA(五:事件):無效 {

 e.currentTarget.removeEventListener(Event.COMPLETE, xmlData); 
    xml = new XML(e.currentTarget.data); 
    dispatchEvent(new Event(Event.COMPLETE)); 
    trace("1");//this used to come second of getXMLData() but it's solved now 
    trace(xml); 

}

公共函數getXMLData():void {

 //This function was coming first so if you don't want to use an event listener outside  
    //this class to wait for event.complete you can use it here to wait for it and access 
    //the function directly without being afraid of the object being null: 
    addEventListener(Event.COMPLETE, go) 
    function go(e:Event){ 
      trace("2"); //now it ONLY comes AFTER the event.complete, no need for external     listeners over this class. declare the class object and use getXMLData() directly cause it always comes second the event handler xmlData() :) 
      trace(xml); 
    } 
} 
1

我想你在XMLLoader()之後立即致電getXMLData()xml對象仍爲空。嘗試撥打getXMLData()裏面xmlData()函數,你應該看到區別。

+0

事情就是在這之後「xml = new XML(e.currentTarget.data);」在事件處理程序中,當您想要在事件處理程序之外跟蹤xml時,該值不再存在,此時它不爲空,並且我希望在事件完成後需要全局訪問任何函數 – bunnyannihilator89

+0

在那個情況很難說出什麼問題。你可以通過調用'XMLLoader'和'getXMLData'發佈完整的代碼嗎? – package

+0

我已經發布了正在發生的事情。看着後面的波紋管。謝謝^^ – bunnyannihilator89

0

您可能在URLLoader完成之前調用getXMLData(),但通常情況下,您正在執行的代碼是不正確的。 Actionscript沒有任何阻塞,所以當你使用URLRequest實例化新的URLLoader時,它立即開始加載操作。例如,如果您的文件被緩存,則在開始加載操作後,您的Event.COMPLETE偵聽器可能永遠不會觸發,因爲您正在附加它。

我已經把它貼下面理想的過程,用於創建和裝載數據:

var data:XML; 
var urlLoader:URLLoader = new URLLoader(); 

urlLoader.addEventListener(Event.COMPLETE, urlLoader_completeHandler); 
urlLoader.load(new URLRequest("path")); 

private function urlLoader_completeHandler(event:Event):void 
{ 
    data = new XML(urlLoader.data); 
} 

如果要將此應用到自己的XMLLoader類,我已經包括在AS3「正確」的實施..但是很詳細。

import flash.net.URLLoader; 
import flash.events.Event; 

class XMLLoader extends URLLoader 
{ 
    public function XMLLoader() 
    { 
     super(); 
     addEventListener(Event.COMPLETE, completeHandler); 
    } 

    private function completeHandler(event:Event):void 
    { 
     dispatchEvent(new XMLLoaderEvent(XMLLoaderEvent.COMPLETE, new XML(data))); 
    } 
} 

class XMLLoaderEvent extends Event 
{ 
    public static const COMPLETE:String = "xmlLoaderComplete"; 

    public var data:XML; 

    public function XMLLoaderEvent(type:String, data:XML = null, bubbles:Boolean = false, cancelable:Boolean = false) 
    { 
     super(type, bubbles, cancelable); 

     this.data = data; 
    } 

    override public function clone():Event 
    { 
     return new XMLLoaderEvent(type, data, bubbles, cancelable); 
    } 
} 

要使用XMLLoader類:

var xmlLoader:XMLLoader = new XMLLoader(); 
xmlLoader.addEventListener(XMLLoaderEvent.COMPLETE, function(event:XMLLoaderEvent):void 
{ 
    trace(event.data); 
}); 

xmlLoader.load(new URLRequest("data.xml")); 

祝您好運!

+0

我不同意這是不好的做法。將響應者添加到HTTPRequest或RemoteObject時,在調用send()之前,您甚至無權訪問該令牌,這就是您實際添加響應者的方式。只要你不在方法體中調用任何函數(或者調度任何導致函數被稱爲elswhere的事件),將你的監聽器或響應者連接到下一行是非常好的。還要注意,沒有必要創建一個新的Event類型來定義一個Event常量(並且URLLoader具有它需要的所有事件)。 –

+0

@stat這就是我的意思;你看到你的第一個代碼,正確的打開任何XML文件?我希望數據對象在函數「urlLoader_completeHandler」之後保留xml內容,所以在「data = new XML(urlLoader.data);」之後,即使跟蹤「urlLoader_completeHandler」函數之外的數據,它也是可訪問的,但如果我跟蹤的數據超出了它的空值。沒有解決方案嗎?所以evrytime我需要訪問數據,我必須通過event.complete? – bunnyannihilator89

+0

我現在會看到代碼的第二部分和第三部分,我會告訴你一些事情,但是第一個我說的給出了和我的代碼一樣的結果。歡呼 – bunnyannihilator89

0

更改跟蹤方法以指示xml是否已加載...
你正在運行到一個競爭條件

private var _xmlLoaded:Boolean=false;// add this to see if the xml is loaded 
private function xmlData(e:Event):void 
{ 
    e.currentTarget.removeEventListener(Event.COMPLETE, xmlData); 
    xml = new XML(e.currentTarget.data); 
    _xmlLoaded=true; 
    dispatchEvent(new Event(Event.COMPLETE)); 
    trace(xml); 
} 
public function getXMLData():void 
{ 
    if (_xmlLoaded) 
     trace(xml); 
    else 
     trace("not yet loaded"); 
} 
+0

我想你會得到我所要求的,我會盡快測試代碼並告訴你一些事情。乾杯 – bunnyannihilator89

相關問題