2012-04-02 3 views
1

Ich bin neu in Actionscript 3, begann gerade damit arbeitet nach Jahren mit AS2 arbeiten,Ändern Wurzelvariablen aus einer Funktion in AS withing 3

Was ich versuche im Moment zu tun ist, zu ändern eine Variable, die in der Wurzel aus einer Funktion,

So etwas gelegen ist:

var myVariable:String = "String test"; 

function testFunction():void 
{ 
myVariable = "new String"; 
} 

ich weiß, das ist problematisch, ich habe versucht, googeln viel darüber, über Getter und Setter, globale Variablen und so, aber ich habe immer noch Probleme damit, ich wäre froh zu verstehen, warum t sein tut nicht und wie man das wirklich macht.

Danke

EDIT: Ich versuche, eine XML-Datei mit einer Liste der Bücher zu laden, Ich sah mich um und fand diese Funktion, versuchte, es zu justieren für mich zu arbeiten, aber ich kann nicht bekommen das funktioniert, Ich bin in der Lage, das XML zu laden und tatsächlich die Informationen von ihm zu lesen, aber ich habe versucht, ein globales Array oder so einzustellen, so dass ich später auf die Daten zugreifen kann,

heres den Code:

var books:XML = loadBooks(); 
trace(books); //Returns a blank output 

function loadBooks():XML { 
    var xmlLoader:URLLoader = new URLLoader(); 
    var xmlData:XML = new XML(); 
    xmlLoader.addEventListener(Event.COMPLETE, LoadXML); 
    xmlLoader.load(new URLRequest("bookList.xml")); 

    function LoadXML(e:Event):void { 
    xmlData = new XML(e.target.data); 
    trace(xmlData); //Returns what I want to have 
    } 

    return xmlData; 
} 
+0

Das Snippet für sich selbst funktioniert gut, solange Sie die Funktion aufrufen, nachdem die Variable definiert ist. Wie testen Sie es? Ich nehme an, da ist eigentlich mehr, was du nicht zeigst? – shanethehat

+0

@shanethehat ja es gibt mehr zu diesem tatsächlich, editierte ich die Frage mit dem, was ich eigentlich versuche zu tun – Radicate

Antwort

0

Das Problem, das Sie haben, wird durch die asynchrone Art des Ladens in AS3 verursacht. In Ihrer loadBooks-Funktion richten Sie einen Listener ein, um das load complete-Ereignis zu erkennen, aber Ihr Code hört dort nicht auf. Während des Ladevorgangs wird die Nachricht munter weitergereicht, was bedeutet, dass Sie tatsächlich ein leeres XML-Objekt zurückgeben.

Dies ist, wie Sie es tun sollten:

//define the variable in wide scope 
var books:XML; 
//start the load operation 
var xmlLoader:URLLoader = new URLLoader(); 
var xmlData:XML = new XML(); 
xmlLoader.addEventListener(Event.COMPLETE, onLoadXML); 
xmlLoader.load(new URLRequest("bookList.xml")); 
//event handler for load complete 
function onLoadXML(evt:Event):void 
{ 
    //clean up the listener 
    xmlLoader.removeEventListener(Event.COMPLETE, onLoadXML); 
    //assign the XML to your books object 
    books = new XML(e.target.data); 
    trace(books); 
    //call a function to use the loaded data 
    readBooks(); 
} 

function readBooks():void 
{ 
    ... 
} 

Sobald Ihr Antrag auf die Ergebnisse einer Ladeoperation abhängig wird, müssen Sie für das Load-Ereignis warten und haben den Handler für dieses Ereignis-Trigger Der nächste Schritt in der Ausführung Ihres Programms. Ich habe dies mit der Funktion readBooks illustriert.

Sie könnten die eigentliche Ladeoperation auch in eine Funktion einschließen, aber die Ladefunktion und den Event-Handler getrennt halten.

Auch per Konvention sollten Funktionsnamen mit einem Kleinbuchstaben beginnen, daher habe ich Ihre Handler-Funktion entsprechend umbenannt.

+0

Vielen Dank für das große Antwort, es war sehr hilfreich, ich verstehe jetzt, was das Problem war, und es funktioniert jetzt genau so, wie ich es wollte! – Radicate

0
MovieClip(parent).nestedMovieClip; 

Die oben aswell

var bob:int = 0; 
MovieClip(parent.parent).bob = 3; 

innerhalb des MovieClip- für Variablen gilt:anstelle der Wurzel zu der Bühne zu verweisen, hat AS3 die Kommunikation zurück geändert zurück zur Mutter Aufruf oder root/Bühne diese Variable geändert wird :: jetzt bob = 3,

das obige wird funktionieren, alle Probleme google "as3 root in as3 :;

oder lassen Sie uns wissen geben Sie mir Ihren Code und ich werde es für Sie arbeiten.

+0

Danke für die Antwort, editierte ich die Frage, ich hoffe, dass ich mich klar gemacht – Radicate

Verwandte Themen