/ / AS3 XML Loading - променливата не съществува извън функцията за зареждане - xml, actionscript-3, flash

AS3 XML Loading - променливата не съществува извън функцията за зареждане - xml, actionscript-3, flash

//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].@name, linksXML.link[i].@param, linksXML.link[i]];
linksDB[i] = new Array(newLink);
trace(linksDB);
}
}
trace(linksXML.*);

Изходът е

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>

Така че по мое мнение светкавицата губи променлива при излизане от функцията. Моля помогнете! Нямам представа защо това се случва

Благодаря предварително!

Отговори:

1 за отговор № 1

Данните в XML бяха запазени в променливата linksXML само когато Event.COMPLETE ръководителят изпълнява задачата си, защото as3 е асинхронен. Проследяване на връзкитеXML var в рамките на processXML функция.

Редактиране:

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

0 за отговор № 2

Всъщност тя съществува, тя просто не е инициализирана, когато я проследите извън манипулатора. Представете си кода малко по следния начин:

  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].@name, linksXML.link[i].@param, 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. Разбира се, просто ще задействате други действия, които разчитат на този XML в processXML, няма да ви е необходима ENTER_FRAME манипулатор, това е само за да илюстрира точка.

Накратко, променливата е достъпна извън функцията, тя просто няма стойност до processXML получава. След това е готова. Чувствайте се свободни да използвате и дебъгер, ако това ви помага.


0 за отговор № 3

Заглавието на публикацията предлага въпрос на обхват. Изглежда, че сте определили масива извън функцията, но не съм сигурен дали 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>

Надяваме се, че това помага малко :) Успех!