2009-08-14 12 views
0

Ok hier ist, was ich gerade versuche zu tun. Ich habe eine Klasse namens vdata.as, die 2 Paramater benötigt. Beide sind Strings, die von der Hauptbühne gesendet werden. Parameter 1 ist der Speicherort für eine XML-Datei, die ich öffnen und lesen muss. Der zweite Parameter ist der Name des Videos, nach dem ich gerade suche.AS3 macht mich verrückt

Jetzt kann ich die Daten aus der XML-Datei abrufen und ohne irgendein Problem anzeigen, wenn es von meiner Klasse aufgerufen wird, aber wenn ich versuche, von der Stufe auf es zuzugreifen, werde ich undefiniert.

import flash.net.*; 
import flash.display.*; 
import flash.events.*; 

public class videoData 
    { 
     private var mName:String; 
    private var mLink:String; 
    private var mCategory:String; 
     public static var elementArray:Array; 

     // Constructor 
    public function videoData(xmlPath:String,xmlVidSrc:String,pMC:MovieClip) 
    { 
     pXmlPath = xmlPath; 
    pXmlVidSrc = xmlVidSrc; 
    xmlloader = new URLLoader(); 
      elementArray = new Array(); 
    } 

     public function getXML() 
    { 
    XMLData(); 
     } 

     private function XMLData() 
    { 
     xmlloader.load(new URLRequest(pXmlPath)); 
    xmlloader.addEventListener(Event.COMPLETE,parseXMLData); 

     } 

     private function parseXMLData():void 
    { 
    var x:XML = new XML(xmlloader.data); 
     Init(x);  
    } 

     private function Init(m:XML):* 
    { 
     var i:Number; 
    for(i=0; i<m.videos.videoname.length(); i++) 
    { 
     if(m.videos.videoname[i][email protected] == pXmlVidSrc) 
     { 
     videoData.elementArray.push(m.videos.videoname[i][email protected]); 
     videoData.elementArray.push(m.videos.videoname[i][email protected]); 
     videoData.elementArray.push(m.videos.videoname[i][email protected]); 
       } 
    } 
}   

}

Wenn ich es von der Hauptbühne nennen, ist der Code wie folgt.

var xData: videoData = neues videoData (xmlPath, vidSrc, this); xData.getXML();

dann, wenn ich versuche, auf alle Elemente von videoData.elementArray zugreifen sie kommen undefined ... Im nur schmatzend mein Kopf auf meinem Schreibtisch versuchen, das herauszufinden, jede Hilfe wäre toll.

Antwort

0

"addEventListener" löst nicht aus ... das Ereignis tut. Sie müssen einen booleschen Zustand für die Stufe hinzufügen, für die elementArray gefüllt wurde, und dies nach der init-Funktion festlegen.

Ist elementArray etwas, das in allen Instanzen von videoData wahr sein muss? Wenn nicht, sollte es nicht statisch sein. Sie können mit MovieClip (this.root) .xData auf diese Instanz der Videoklasse von einer Ihrer anderen Klassen zugreifen.

Wenn das Ereignis abgeschlossen ist und das Array noch leer ist, wurde es nicht von Ihrem Parser aufgefüllt. Sie können tun, überprüfen auch, ob die elementArray.length> 0

EDIT in Reaktion zu sehen Kommentar:

als öffentliches Mitglied oder vorzugsweise eine schreibgeschützte Eigenschaft macht eine boolean Variable:

var parseComplete:Boolean; 

Setzen Sie es in Ihrem Konstruktor auf false.

Dann, nach Ihrem Anruf "Init" in Ihrem Event.COMPLETE Rückruf Set:

parseComplete=true; 

Dann sicher parseComplete machen == true, bevor Sie überhaupt elementarray zugreifen. Wenn Sie für den Parser darauf warten vervollständigen Sie vielleicht ein Timeout oder irgendeine Art von try/catch-Mechanismus nur für den Fall gibt es unvorhergesehene Fehler festlegen möchten, dass irgendeine Art von verursachen würde:

while(!xData.parseComplete) { } 

Um Schleife auf unbestimmte Zeit . Es hängt alles von der Verwendung ab. Persönlich würde ich wahrscheinlich einen Rückruf von dem Ereignis-Listener zu der Bühne hinzufügen, um auszulösen, was als nächstes passieren sollte.

+0

Danke. Es tut mir leid, ein Schmerz zu sein, aber könnte ich ein Beispiel dafür bekommen, was du meinst, indem du einen booleschen Wert für die Bühne hinzufügst. Ich denke, ich habe eine Idee, aber ich will nur sichergehen. Und kein elementArray muss nicht wahr sein. Ich habe nur die statische entfernt. – 2Alpha

+0

danke sehr geschätzt. – 2Alpha

+0

hat das den Trick gemacht? – McAden

1

Warum ist elementArray eine statische Variable, Sie müssen sie nur veröffentlichen, um sie außerhalb der Funktion zu verwenden.

Ich bin ziemlich verwirrend, aber vielleicht möchten Sie ein Debugging-Tool wie "De MonsterDebugger" versuchen, würde ich mit der Verfolgung von xmlloader.data in der parseXMLData-Funktion beginnen.

+0

im Grunde, was es tun soll, ist die XML-Daten dump es in ein Array und zurück zur Hauptbühne, damit ich es sonst in der App verwenden konnte.Aber momentan funktioniert es nicht. Wie ich schon sagte, kann ich die Daten zwar in der Klasse sehen, aber nicht in der Hauptphase. Tatsächlich kann ich es nicht einmal sehen, nachdem der addeventlistener ausgelöst hat. Ich überprüfe den Debuger und schaue, was dabei herauskommt. – 2Alpha

Verwandte Themen