2009-05-16 7 views
1

Ich bin ein C# -Entwickler, der versucht, einige AS3 zu lernen, so wird dies eine ziemlich neue Frage sein.Benutzerdefinierte AS3-Klasse ist Null nach dem Hinzufügen zu Array

Ich bin verwirrt in Bezug auf Scope und GC, wie ich eine benutzerdefinierte MovieClip-Erweiterung Klasse (Folie) habe, die ich Instanzen innerhalb einer Schleife und push() in ein Array erstellen, aber danach sind die Elemente null wenn ich sie aus der Sammlung ziehe.

var ldr:URLLoader = new URLLoader(); 
ldr.load(new URLRequest("presentation.xml")); 
ldr.addEventListener(
    Event.COMPLETE, 
    function(e:Event):void { 
     config = new XML(e.target.data); 
     for (var i:Number = 0; i < config.slides.slide.length(); i++) 
     { 
      var node = config.slides.slide[i]; 
      var slide:Slide = new Slide();      
      slides.push(slide); 

      addChild(slide); // Works fine 
     } 
    } 
); 

slides.forEach(function(e:*, index:int, array:Array):void 
    { 
     addChild(e); // Causes "Parameter child must be non-null" exception 
    } 
); 

Ich mag würde die Folien später, um Referenzen zu können, um sie bei Bedarf zu wechseln - Wie kann ich den Verweis auf meine neue Objekte?

Update: Es scheint, dass es zwei Probleme mit diesem gab. Der forEach-Aufruf wurde ausgeführt, bevor das vollständige Ereignis des URLLoaders aufgerufen wurde, und auch forEach scheint nicht wie erwartet zu funktionieren. Hier ist der letzte Arbeitscode:

var ldr:URLLoader = new URLLoader(); 
ldr.load(new URLRequest("presentation.xml")); 
ldr.addEventListener(
    Event.COMPLETE, 
    function(e:Event):void { 
     config = new XML(e.target.data); 
     for (var i:Number = 0; i < config.slides.slide.length(); i++) 
     { 
      var node = config.slides.slide[i]; 
      var slide:Slide = new Slide();      
      slides.push(slide); 
     } 
     for each (var sl in slides) 
     { 
      addChild(sl); 
     } 
    } 
); 

Antwort

1

Versuchen Sie dies. Mal sehen, ob es Ihre Folien verfolgt.

var ldr:URLLoader = new URLLoader(); 
ldr.addEventListener(Event.COMPLETE, processXML); 
ldr.load(new URLRequest("presentation.xml")); 

function processXML(e:Event):void { 
    config = new XML(e.target.data); 
    var slide:Slide; 
    for (var i:Number = 0; i < config.slides.slide.length(); i++) 
    { 
     var node = config.slides.slide[i]; 
     slide = new Slide();           
     slides.push(slide); 

     addChild(slide); // Works fine 
    } 

    for each(var slide:Slide in slides){ 
     trace(slide); 
    } 
} 

Ich kodiere es hier, also kann ich nicht versichern, dass es funktioniert. Außerdem habe ich den Rest des Codes nicht, also müssen Sie es selbst testen.

+0

Setzen Sie eine "var" vor dem "slide in slides" und ich werde Sie als Antwort markieren! – tags2k

+0

Fertig. Tut mir leid, es passiert, wenn Sie versuchen, das Codieren zu improvisieren! : P – ozke

3

Ihre slides.forEach Aufruf ausgeführt wird, bevor das Ereignis wird ausgelöst, so dass die Dias Array keine Werte hat.

+0

Doh, natürlich ist es! Ich muss aufhören, C# zu denken und anfangen, jQuery zu denken ... – tags2k

+0

Ah, aber warum werde ich null Einzelteile gesendet? Sicher, wenn das Array leer ist, sollte es mir nichts geben? – tags2k

+0

Ich habe jetzt versucht, die forEach in den Event-Callback zu verschieben und es funktioniert immer noch nicht :( – tags2k

Verwandte Themen