2012-09-12 57 views
1

我剛開始探索包的使用。我希望函數的結果(作爲變量「myXML」)可用於代碼的其他元素。我想知道是否要創建一個新的類文件。例如:需要一些幫助瞭解AS3中包的使用

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.net.URLLoader; 
    import flash.net.URLRequest;  

    public class XMLLoad 
    { 
     public var myXML:XML; 
     public var myLoader:URLLoader = new URLLoader(); 
     myLoader.load(new URLRequest("http://myWebsite/myFile.xml")); 
     myLoader.addEventListener(Event.COMPLETE, processXML); 

     public function processXML(e:Event):void 
     { 
      myXML = new XML(e.target.data); 
      trace(myXML); 
     } 

    } 

} 

這是創建全局變量的好方法嗎?如果是這樣,在FLA文件中,我將如何訪問/使用保存XML數據的var「myXM」?

import XMLLoad; 
XMLLoad(); 
? 

非常感謝。

回答

2

你在你的班上做什麼是幾乎沒有的,但有一些需要加以糾正的幾件事情:

首先,一類減速的頂層,你只允許內定義成員(屬性和方法)。目前,你這樣做,這是偉大的,但你也試圖在此範圍內運行一些實際的代碼,以及:

myLoader.load(new URLRequest("http://myWebsite/myFile.xml")); 
myLoader.addEventListener(Event.COMPLETE, processXML); 

這將引發和錯誤,你的類將無法正常工作。要在創建類的實例時立即運行代碼,您需要使用constructor,這是一個使用與其中聲明的類相同的名稱(區分大小寫)的函數。轉換到這一點的代碼看起來像這樣,在那裏你會發現我已經創建的構造和放置其內的罪魁禍首代碼:

public class XMLLoad 
{ 

    public var myXML:XML; 
    public var myLoader:URLLoader = new URLLoader(); 


    // This is the constructor. 
    public function XMLLoad() 
    { 
     myLoader.load(new URLRequest("http://myWebsite/myFile.xml")); 
     myLoader.addEventListener(Event.COMPLETE, processXML); 
    } 


    public function processXML(e:Event):void 
    { 
     myXML = new XML(e.target.data); 
     trace(myXML); 
    } 

} 

你現在所做的事,創建一個類XMLLoad。使用new關鍵字,您可以創建該類的實例。在你的情況,你只需要一個實例做你想做的,是這樣的:

var xmlLoad:XMLLoad = new XMLLoad(); 

這將創造XMLLoad一個實例,並將其賦值給變量xmlLoad,通過它你就可以訪問您在該類中定義的屬性和方法。我們上面創建的構造函數也會自動運行,這意味着你的類已經發起了一些XML的請求。

不幸的是,因爲對外部數據請求是異步(也就是說,它們在時間軸上這是你的應用的自然流動的不同進行),我們無法知道何時XML完全加載,我們能夠從課外使用它。但是什麼我們能做的就是改變XMLLoad類一點點地幫助我們:

public class XMLLoad 
{ 

    public var myXML:XML; 
    public var myLoader:URLLoader = new URLLoader(); 
    private var _callback:Function; 

    public function XMLLoad(callback:Function) 
    { 
     _callback = callback; 
     myLoader.load(new URLRequest("http://myWebsite/myFile.xml")); 
     myLoader.addEventListener(Event.COMPLETE, processXML); 
    } 

    public function processXML(e:Event):void 
    { 
     myXML = new XML(e.target.data); 
     _callback(myXML); 
    } 

} 

我們在這裏所做的是修改構造函數接受引用的函數,它應該接受的參數鍵入XML。然後,我們修改了您的processXML函數以執行回調並將收到的XML發送給它。這意味着,你現在可以這樣做:

var xmlLoad:XMLLoad = new XMLLoad(done); 

function done(xml:XML):void 
{ 
    trace(xml); 
} 

這意味着你將能夠在done功能,這將提供給您滿載XML內繼續您的應用程序。

+0

太棒了!謝謝@marty。偉大的貢獻。我一直在努力。我將把所有的數據放入我的應用程序中。所以能夠在全球範圍內訪問它將使其更容易。此刻,我在XML Process函數中有其餘的編碼。我將打印出來並詳細介紹它。 – Stephen

2
  1. 創建一個名爲 「Variables.as」

  2. 代碼類裏面是像這樣(注:沒有的功能,只是變量):

    // Define these variables in the normal place where you would 
    // define them in an AS3 class/package 
    
    public static var enabled:Boolean = false; 
    public static var configXMLData:XML; 
    
  3. 使用,導入Variables.as,並使用Variables.enable = true或trace(Variables.enable)等進行調用和設置。爲所需變量添加公共靜態var列表。

  4. XML加載可以在外部類或主應用程序中完成。聽起來你對AS3不太瞭解(沒有冒犯性),所以我現在就保持簡單,並將它粘貼在你的主類中。所有的代碼幫助都在Adobe Live Docs中(例如,當你使用谷歌搜索時,那裏有一些關鍵詞)。 AS3 LoadXML googles會給你很多例子。注意設置,加載,加載完成,獲取數據就是你想要的流程流程。因此,只有在調用onComplete函數後,才能繼續進行應用程序。

  5. 一旦你的XML加載谷歌up AS3 E4X解析。這是一個很大的主題,您可以使用XML E4X for AS3檢索屬性和節點內容的值。這並不難,您需要示例才能參考。還有一種老式的XML列表方式,您可以在這裏找到文檔和示例的Adobe Live Docs xmlList。一旦你對此有足夠的瞭解,你就可以隨意在類文檔Variables.as中設置變量。無論你需要什麼類型,你都可以在任何你想要的類中調用Variables.enable。

+0

是有很大幫助;謝謝@Darcey – Stephen

2

馬蒂華萊士的答案涵蓋了你需要知道的一切,讓你的問題得到解答和工作。不過,我想補充一點,因爲你試圖讓這些變量爲Global,所以有一個危險的陷阱。

危險之處在於,每次您撥打new時,都會得到一個新的變量實例。意外地創建兩組或更多組全局變量可能非常容易,每組全局變量都有不同的值。

有兩種解決方法:只使用static變量,或將該類寫入單例。

第一個簡單得多,只需將static關鍵字添加到變量中,並記住用XMLLoad. variable_name引用它們,而不是創建新實例。

public class XMLLoad { 
    public static var myXML:XML; 
    public static var myLoader:URLLoader = new URLLoader(); 
    private static var _callback:Function; 

    public static function loadXML(callback:Function):void 
    { 
     _callback = callback; 
     myLoader.load(new URLRequest("http://myWebsite/myFile.xml")); 
     myLoader.addEventListener(Event.COMPLETE, processXML); 
    } 

    public function processXML(e:Event):void 
    { 
     myXML = new XML(e.target.data); 
     _callback(myXML); 
    } 
} 

然後,再次從馬蒂借:

XMLLoad.loadXML(done); 

function done(xml:XML):void { 
    trace(xml); 
} 

這是很好的,但在更復雜的情況變得有點羅嗦和混亂。另一方面,單身人士以同樣的方式工作,但表現得像一個普通的班級。雖然內部工作可能會更復雜一點。

public class XMLLoad { 
    /** 
    * A static variable that holds the actual instance of the class. 
    **/ 
    private static var instance:XMLLoad; 

    public var myXML:XML; 

    /** 
    * An initialization method that replaces the constructor and creates 
    *  (if it didn't already exists) and returns the instance for external 
    *  use. 
    **/ 
    public static function GetLoader():XMLLoad { 
     if (!instance) { 
      instance = new XMLLoad; 
     } 
     return instance; 
    } 

    public function loadXML(callback:Function):void { 
     _callback = callback; 
     myLoader.load(new URLRequest("http://myWebsite/myFile.xml")); 
     myLoader.addEventListener(Event.COMPLETE, processXML); 
    } 

    private function processXML(e:Event):void { 
     myXML = new XML(e.target.data); 
     _callback(myXML); 
    } 
} 

這一類的調用是這樣的:

var xmlLoader:XMLLoad = XMLLoad.GetLoader(); 
xmlLoader.loadXML(done); 

function done(xml:XML):void { 
    trace(xml); 
} 
+0

好點@jeremy,謝謝你的明確解釋。我認爲'靜態'可能是與此一致的方式,我會加入並測試。 – Stephen