2012-09-14 30 views
0
//Generating menu from XML 
var linksXML:XML; 
var linksLoader:URLLoader = new URLLoader(); 
var linksDB:Array = new Array(); 
linksLoader.load(new URLRequest("menu_links.xml")); 
linksLoader.addEventListener(Event.COMPLETE, processXML); 
function processXML(evnt:Event):void { 
    linksXML = new XML(evnt.target.data); 
    for (var i:int = 0; i < linksXML.link.length(); i++){ 
     var newLink:Array = [linksXML.link[i][email protected], linksXML.link[i][email protected], linksXML.link[i]]; 
     linksDB[i] = new Array(newLink); 
     trace(linksDB); 
    } 
} 
trace(linksXML.*); 

輸出是AS3 XML負載 - 變量不裝載功能外存在

Second trace: 
null 
First trace: 
<menu> 
    <link name="first" param="true">first.php</link> 
    <link name="second" param="true">second.php</link> 
    <link name="third" param="true">third.php</link> 
</menu> 

所以,在我看來,閃光exitin函數時失去變量。請幫忙!我不知道爲什麼會發生這種情況

在此先感謝!

+1

這不是你的情況確切的問題。 Flash是一個異步的。所以它不會等到第一行完成執行時才執行第二行。現在你可以猜測'trace(linksXML。*)'在加載事件完成之前執行了。 「null」的原因是'linksXML'是在加載完成事件函數中定義的。 – Moorthy

回答

1

僅當Event.COMPLETE處理程序完成其任務,因爲as3是異步的時,XML數據才存儲在linksXML變量中。跟蹤processXML函數中的linksXML var。

編輯:

function processXML(e:Event):void{ 
     ..... 
     ..... 
    futureAction(); 
} 
function futureAction():void{ 
    trace(linksXML); 
} 
+0

完整的處理函數調用processXML – Neil

+0

我該怎麼做才能讓變量存在函數之外,因爲需要使其他函數正常工作 – kamilosxd678

0

實際上它確實存在,當你跟蹤它的處理器之外只是未初始化。試想一下代碼,像這樣:

  1. 初始化變量
  2. 加載XML
  3. 設置爲XML加載器加載完整的處理程序
  4. 跟蹤XML

我省略的processXML因爲即使您將其定義如上

trace(linksXML.*); 

它並不意味着它被調用,它是一個異步函數,當URLLoader完成加載時被調用。您在加載後立即跟蹤xml,因此,在那個時候,xml將無法準備好。

,如果有幫助,試試這個:

var linksXML:XML; 
var linksLoader:URLLoader = new URLLoader(); 
var linksDB:Array = []; 
linksLoader.load(new URLRequest("menu_links.xml")); 
linksLoader.addEventListener(Event.COMPLETE, processXML); 
function processXML(evnt:Event):void { 
    linksXML = new XML(evnt.target.data); 
    for (var i:int = 0; i < linksXML.link.length(); i++){ 
     linksDB[i] = [linksXML.link[i][email protected], linksXML.link[i][email protected], linksXML.link[i]]; 
     trace(new Date() + " xml parsed: \n"+linksDB); 
    } 
} 
addEventListener(Event.ENTER_FRAME,checkXML); 
function checkXML(event:Event):void{ 
    trace(new Date(),linksXML); 
    if(linksXML != null) removeEventListener(Event.ENTER_FRAME,checkXML); 
} 

它應該更容易,看看會發生什麼的XML。當然,您只需觸發其他依賴於processXML中的XML的操作,您就不需要ENTER_FRAME處理程序,它只是爲了說明一個問題。

總之,該變量在函數外部是可訪問的,它只是沒有值直到 processXML被調用。在那之後,它已經準備好了。如果有幫助,請隨意使用調試器。

0

帖子的標題提示了範圍問題。看起來你已經在函數之外定義了數組;不過,我不確定var linksDB:Array = new Array();是否正確。試試var linksDB:Array = [];

這是一個簡單的XML加載的東西,我很久以前放在一起。內容是不相關的,你在做什麼,但覺得如果你像我一樣:)工作的例子可能是有用的

var xmlLoad = new URLLoader(xmlLocation); 
xmlLoad.addEventListener(Event.COMPLETE, buildSlider); 

function buildSlider(e){ 

    var adList = new XML(e.target.data); 
    numPics = adList.ad.length(); 

    for(var i in adList.ad){ 
     var pic = new Pic; 
     pic.pic = adList.ad[i].pic; 
     pic.clicky = adList.ad[i].clicky; 
     pic.init(); 
     pic.x = picWidth * i;  
     contentHolder.addChild(pic); 
    } 
    endChecker(); 

    // autoplay until end of list, or until user clicks 
    autoInterval = setInterval(nextButtClick, 4000); 
} 

XML:

<?xml version="1.0" encoding="UTF-8"?> 
<ads> 

    <ad> 
     <pic>40-Hinton-Gardens.jpg</pic> 
     <clicky>http://corderhomes.com</clicky> 
    </ad> 

    <ad> 
     <pic>644-Haymarket-Lane.jpg</pic> 
     <clicky>http://corderhomes.com</clicky> 
    </ad> 

    <ad> 
     <pic>756-Cambridge-Lane.jpg</pic> 
     <clicky>http://corderhomes.com</clicky> 
    </ad> 

    <ad> 
     <pic>9809-Charolais-Drive.jpg</pic> 
     <clicky>http://corderhomes.com</clicky> 
    </ad> 


</ads> 

希望幫助一點點:) 祝你好運!