/ / AS3 XML Loading - zmienna nie istnieje poza funkcją ładowania - xml, Actionscript-3, flash

AS3 XML Loading - zmienna nie istnieje poza funkcją ładowania - 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.*);

Wyjście to

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>

Więc moim zdaniem flash traci zmienną po wyjściu z funkcji. Proszę pomóż! Nie mam pojęcia, dlaczego tak się dzieje

Z góry dziękuję!

Odpowiedzi:

1 dla odpowiedzi № 1

Dane XML zostały zapisane w zmiennej linksXML tylko wtedy, gdy Event.COMPLETE moduł obsługi kończy swoje zadanie, ponieważ as3 jest asynchroniczny. Śledź linki XML var w processXML funkcjonować.

Edytować:

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

0 dla odpowiedzi nr 2

Właściwie to istnieje, po prostu nie jest inicjowany, gdy wyśledzisz go poza programem obsługi. Wyobraź sobie kod podobny do tego:

  1. inicjować zmienne
  2. załaduj xml
  3. ustaw moduł obsługi zakończenia ładowania dla modułu ładującego xml
  4. śledzenie xml

Pominąłem processXML, ponieważ mimo że zdefiniowałeś go powyżej

trace(linksXML.*);

to nie znaczy, że zostaje tam wywołane, to jestfunkcja asynchroniczna, która jest wywoływana po zakończeniu ładowania URLLoader. Śledzisz xml natychmiast po załadowaniu, a zatem w tym momencie xml nie będzie gotowy.

Jeśli to pomoże, spróbuj tego:

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);
}

Powinno to ułatwić sprawdzenie, co dzieje się z plikiem XML. Oczywiście, po prostu uruchomisz inne działania, które polegają na tym XML w processXML, nie potrzebujesz ENTER_FRAME handler, to tylko po to, żeby zilustrować punkt.

Krótko mówiąc, zmienna jest dostępna poza funkcją, po prostu nie ma wartości aż do zostaje wywołany procesXML. Po tym momencie jest gotowy. Możesz użyć debuggera, jeśli pomoże.


0 dla odpowiedzi № 3

Tytuł postu sugeruje kwestię zakresu. Wygląda na to, że zdefiniowałeś tablicę poza funkcją, ale nie jestem pewien, czy var linksDB:Array = new Array(); to właściwy sposób, aby to zrobić. Próbować var linksDB:Array = [];

Oto prosta, ładowana przez XML rzecz, którą przygotowałem dawno temu. Treść nie jest związana z tym, co robisz, ale uważam, że działający przykład może być przydatny, jeśli jesteś podobny do mnie :)

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>

Mam nadzieję, że to trochę pomoże :) Powodzenia!