OOP in Flash - Konstruktor lässt warten

Mayday171

Erfahrenes Mitglied
Hallo,

ich habe eine Klasse geschrieben die im Konstruktor eine XML ausliest.

PHP:
class Pfade {
	private var xml:XML;
	
	
	public function Pfade(pfad:String) {
		var xml = new XML();
		xml.ignoreWhite=true;
		xml.load(pfad);
		xml.onLoad = function(erfolg) {
			if(erfolg) {
				var childItems:Array = xml.firstChild.childNodes; // NODES der Bilderserie in Array gepackt
				for(var i=0;i<childItems.length;i++) {	// SERIEN werden duchlaufen und auf value überprüft --> value = pageid
					if(childItems[i].attributes.value==_root.p) {
						_root.bildpfade=new Array;
						_root.bildpfade=childItems[i].childNodes;
					}
				}
				
			}
		}
	}
	
}

Das Auslesen läuft super! Möchte aber nun das Ergebnis in einer Variable speichern und im Film abfragen können. Hab es in diesen Beispiel so gemacht, dass ich direkt auf dem _root eine Variable erstelle und dieser dann das Ergebnis aus der XML zuweiße. Habe es vorher auch schon mit einer Methode versucht.

Das Problem bei der ganzen Geschichte ist, dass er den Code auf der Hauptebene im Flashfilm... (diesen:)

PHP:
p=1;
var pfade:Pfade = new Pfade("2.xml");
trace(_root.bildpfade[0])

schneller durcharbeitet als er den Konstruktor erstellt. Sehr blöd wie ich finde. In Java habe ich nie Probleme mit EventHandlern in Konstruktoren.

Was kann man da machen

Mfg und Danke!!
 
Hi,

schneller durcharbeitet als er den Konstruktor erstellt. Sehr blöd wie ich finde. In Java habe ich nie Probleme mit EventHandlern in Konstruktoren.
Das ist nicht das Problem (und auch nicht der Fall), sondern die Tatsache, dass das Laden einer externen Datei asynchron abläuft:

Der Konstruktor wird also ausgeführt (kann auch durchaus Werte zurückgeben), die dort erstellte onLoad-Methode des XML-Objekts allerdings erst einige Zeit später (und zwar dann, wenn die Daten geladen sind). Wäre dem nicht so, würde jeder Flashfilm anhalten, wärend Daten von einer externen Quelle angefordert werden, und das wäre ja auch kaum im Sinne des Erfinders. ;)

Die Lösung heisst hier "Callback": Gib dem Konstruktor eine Methode mit, die beim onLoad-Ereignis aufgerufen werden soll:
Code:
p=1;
var pfade:Pfade = new Pfade("2.xml", wennDa);

function wennDa(pfade) {
  trace(pfade[0]);
}
In der Klasse dann sinngemäß:
Code:
public function Pfade(pfad:String, _callback:Function) {
        var xml = new XML();
        xml.ignoreWhite=true;
        xml.load(pfad);
        xml.onLoad = function(erfolg) {
            if(erfolg) {
                var childItems:Array = xml.firstChild.childNodes; // NODES der Bilderserie in Array gepackt
                var pfade:Array = new Array();
                for(var i=0;i<childItems.length;i++) {    // SERIEN werden duchlaufen und auf value überprüft --> value = pageid
                    if(childItems[i].attributes.value==_root.p) {
                        pfade[i]=childItems[i].childNodes;
                    }
                }
                
            }
            _callback(pfade);
        }
    }

Weder das lokale Erstellen der onLoad-Methode noch die Übergabe der Callback-Funktion sind sauberes OOP, aber zur Verdeutlichung der Vorgehensweise genügt mein Beispiel hoffentlich.

Gruß
.
 
Zurück