2009-08-14 50 views
0

好的,這是我目前正在嘗試做的。我有一個名爲vdata.as的類,它需要2個參數都是從主階段發送的字符串。參數一是我需要打開並閱讀的XML文件的位置。第二個參數是我目前正在查找的視頻的名稱。AS3驅使我堅果

現在,我可以從XML文件中獲取數據,並在沒有任何問題的情況下顯示它,如果從我的類中調用它,但是當我嘗試從階段中訪問它時,我會得到未定義的問題。

import flash.net.*; 
import flash.display.*; 
import flash.events.*; 

public class videoData 
    { 
     private var mName:String; 
    private var mLink:String; 
    private var mCategory:String; 
     public static var elementArray:Array; 

     // Constructor 
    public function videoData(xmlPath:String,xmlVidSrc:String,pMC:MovieClip) 
    { 
     pXmlPath = xmlPath; 
    pXmlVidSrc = xmlVidSrc; 
    xmlloader = new URLLoader(); 
      elementArray = new Array(); 
    } 

     public function getXML() 
    { 
    XMLData(); 
     } 

     private function XMLData() 
    { 
     xmlloader.load(new URLRequest(pXmlPath)); 
    xmlloader.addEventListener(Event.COMPLETE,parseXMLData); 

     } 

     private function parseXMLData():void 
    { 
    var x:XML = new XML(xmlloader.data); 
     Init(x);  
    } 

     private function Init(m:XML):* 
    { 
     var i:Number; 
    for(i=0; i<m.videos.videoname.length(); i++) 
    { 
     if(m.videos.videoname[i][email protected] == pXmlVidSrc) 
     { 
     videoData.elementArray.push(m.videos.videoname[i][email protected]); 
     videoData.elementArray.push(m.videos.videoname[i][email protected]); 
     videoData.elementArray.push(m.videos.videoname[i][email protected]); 
       } 
    } 
}   

}

當我把它從主級的代碼如下。

var xData:videoData = new videoData(xmlPath,vidSrc,this); xData.getXML();

然後,當我嘗試訪問videoData.elementArray的任何元素時,他們會發現undefined ... 我只是在我的桌子上砸我的頭,試圖找出任何幫助將是偉大的。

回答

0

「addEventListener」不會「激發」......事件發生。您需要添加一個布爾值來聲明elementArray已被填充的階段,並在init函數之後設置它。

是elementArray在videoData的所有實例中都必須是true的東西嗎?如果不是,它不應該是靜態的。您可以使用MovieClip(this.root).xData從其他類中的一個訪問視頻類的實例。

如果事件已完成且數組仍然爲空 - 那麼它不會被解析器填充。你也可以做檢查,看看是否在響應elementArray.length> 0

編輯評論:

爲公共成員或最好是隻讀屬性使一個布爾變量:

var parseComplete:Boolean; 

在構造函數中將其設置爲false。

然後,你的電話到「初始化」在您的Event.COMPLETE回調集後:

parseComplete=true; 

然後確保parseComplete ==真之前你曾經訪問elementArray。如果你在等待解析器完成您可能需要設置超時或以防萬一有任何意外錯誤,某種的try/catch機制會導致某種:

while(!xData.parseComplete) { } 

無限循環。這一切都取決於使用情況。就我個人而言,我可能會添加從事件監聽器到舞臺的回調,以觸發下一次應該發生的事情。

+0

謝謝。抱歉是一種痛苦,但是我可以通過「添加一個布爾值來表示舞臺狀態」來獲得一個例子嗎?我想我有一個想法,但只是想確認一下。沒有elementArray不需要是真的我只是從中刪除靜態。 – 2Alpha 2009-08-14 21:09:49

+0

非常感謝你的讚賞。 – 2Alpha 2009-08-14 22:18:12

+0

是否做到了這一點? – McAden 2009-08-15 07:43:48

1

爲什麼elementArray是一個靜態變量,你只需要公開就可以在函數外部使用它。

我很困惑,但你可能想嘗試像「De MonsterDebugger」這樣的調試工具,我會先在parseXMLData函數中跟蹤xmlloader.data。

+0

基本上它假設要將XML數據轉儲到數組並將其返回到主要階段,以便我可以在應用程序中使用它。但目前它不起作用。就像我說過的,我可以在課堂上看到數據,但無法在主要階段查看。其實我在addeventlistener發射後甚至看不到它。我檢查一下這個debuger,看看它出現了什麼。 – 2Alpha 2009-08-14 20:41:11