Flash - Klassen-Eigenschaft liefert immer null
Matze
- programmiertechnik
Hallo!
Ich versuche mit ActionScript eine XML-Datei auszulesen (was auch funktioniert) und zu verarbeiten. Leider liefert mir meine Klasse immer null als Wert.
Geb ich die Variable aber in der Klasse selbst aus, stimmt der Inhalt.
Woran liegt das?
Hier der Code der Klasse:
package com {
import flash.display.MovieClip;
import flash.net.URLLoader;
import flash.events.Event;
import flash.net.URLRequest;
public class readXMLFile {
private var contentXMLUrl:String = "myxml.xml";
public var XMLContent:XMLList;
public function readXMLFile() {
var xmlLoader:URLLoader = new URLLoader();
xmlLoader.addEventListener(Event.COMPLETE, XMLloaded);
xmlLoader.load(new URLRequest(contentXMLUrl));
}
private function XMLloaded(e:Event):void {
var XMLRes:XML = new XML(e.currentTarget.data);
XMLRes.ignoreWhite = true;
// nur Elementbaum mit "myElements"
this.XMLContent = XMLRes.myElements;
// gibt mir die XMLListe aus - das klappt hier
trace(this.XMLContent);
}
}
}
So wird die Klasse aufgerufen:
import com.readXMLFile;
var foo:readXMLFile = new readXMLFile();
// hier bekomme ich null als Wert
trace(foo.XMLContent);
Was mich auch verwundert, ist die Reihenfolge der Ausgaben.
Zuerst bekomme ich null vom zweiten trace() (also trace(foo.XMLContent), danach die gewünschte XML-Liste (von trace(this.XMLContent); in der Klasse).
Meines Verständnisses nach sollte aber erst der Teil in der Klasse ausgeführt werden, dann erst die Abfrage nach dessen Eigenschaften.
Wo liegt hier mein Fehler?
Danke und Grüße, Matze
Hallo Matze,
Wo liegt hier mein Fehler?
Flash reagiert auf Programmierfehler gerne mit äußerst absurdem Verhalten. Vielleicht löst es dein Problem schon, wenn du die Klasse und die zugehörige Methode zum Lesen der XML-Datei *nicht* gleich nennst?
Grüße
Richard
Hallo Richard,
Flash reagiert auf Programmierfehler gerne mit äußerst absurdem Verhalten. Vielleicht löst es dein Problem schon, wenn du die Klasse und die zugehörige Methode zum Lesen der XML-Datei *nicht* gleich nennst?
du meinst so?
public class readXMLFile {
[..]
public function readXMLFiles() { [..]
^
und beim Aufruf so?
var foo:readXMLFile = new readXMLFile(); // ..File als Klasse
foo.readXMLFiles(); // ..FileS als Methode
trace(foo.XMLContent); // null :(
Das ändert leider nichts am Ergebnis. Oder hab ich dich falsch verstanden?
Grüße, Matze
Hallo Matze,
Das ändert leider nichts am Ergebnis. Oder hab ich dich falsch verstanden?
Nein, das war schon das, was ich meinte. Hat aber wohl leider auch nichts gebracht.
Grüße
Richard
Hallo,
private function XMLloaded(e:Event):void {
var XMLRes:XML = new XML(e.currentTarget.data);
XMLRes.ignoreWhite = true;
// nur Elementbaum mit "myElements"
this.XMLContent = XMLRes.myElements;
// gibt mir die XMLListe aus - das klappt hier
trace(this.XMLContent);
diese Funktion wird erst nach dem vollständigen Laden der XML-Datei aufgerufen
var foo:readXMLFile = new readXMLFile();
// hier bekomme ich null als Wert
trace(foo.XMLContent);[/code]
Dieses "trace" kommt zu schnell, die Funktion XMLloaded wurde noch nicht ausgeführt und foo.XMLContent ist demzufolge null.
Was mich auch verwundert, ist die Reihenfolge der Ausgaben.
Zuerst bekomme ich null vom zweiten trace() (also trace(foo.XMLContent), danach die gewünschte XML-Liste (von trace(this.XMLContent); in der Klasse).
siehe oben
Grüße Basti
Hey Basti,
Dieses "trace" kommt zu schnell, die Funktion XMLloaded wurde noch nicht ausgeführt und foo.XMLContent ist demzufolge null.
recht herzlichen Dank! Das erklärt das Problem zumindest.
Ich dachte der Compiler arbeitet erst die Klasse vollständig ab bevor er im Code fortfährt.
Wie kann ich das jetzt ändern?
Dank und Gruß, Matze
Hallo,
ich habe leider keine große Erfahrung mit OOP - Du könntest z.B. die nächste Aktion, welche nach dem Laden der XML-Datei durchgeführt werden soll, in der XMLoaded-Funktion auslösen.
Grüße Basti
Hallo,
ich habe leider keine große Erfahrung mit OOP - Du könntest z.B. die nächste Aktion, welche nach dem Laden der XML-Datei durchgeführt werden soll, in der XMLoaded-Funktion auslösen.
ich glaub mittlerweile auch, dass das die einzige Möglichkeit ist.
Ich muss die muss die Elemente also "durchschleifen" :(
Danke und Grüße, Matze
Hallo!
Ich habe das Problem jetzt gelöst. Fürs Archiv:
Die Klasse muss um einen Event erweitert werden, der triggert wenn die XML vollständig geladen ist:
private function XMLloaded(e:Event):void {
var XMLRes:XML = new XML(e.currentTarget.data);
XMLRes.ignoreWhite = true;
// nur Elementbaum mit "myElements"
this.XMLContent = XMLRes.myElements;
dispatchEvent(new Event(Event.COMPLETE)); // <- hier wird der Event gefeuert
}
Der Aufruf der Klasse wird dann durch einen EventListener erweitert.
var foo:readXMLFile = new readXMLFile();
foo.addEventListener(Event.COMPLETE,xmlComplete); // <- warten bis XML geladen
function xmlComplete(e:Event):void {
// funktioniert! :)
trace(foo.XMLContent);
}
Ich hoffe es hilft noch jemand anderem, es hat mir den Kopf zerbrochen.
Grüße, Matze