2009-06-11 4 views
0

Ich schreibe eine MXML-KomponenteActionscript 3 und mxml ... blockiert, während auf ein Ereignis warten

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" preinitialize="onPreInitialize();" "creationComplete()"> 


<mx:Script> 
<![CDATA[ 
    private function onPreInitialize():void 
    { 
     addEventListener("RemoteResourceLoaded", remoteResourceLoaded); 
     loadARemoteResource(); 
    } 
]]> 
</mx:Script> 

Ich habe einige MXML-Tags in meiner Komponente, die Variablen aus der Remote-Ressource verweisen. Dies führt zu Null-Referenzfehlern, da Flex versucht, alle mxml-Komponenten zu laden, bevor die Remote-Ressource geladen wurde. Ich würde es lieben, wenn ich Flex in seinem Pre-Initialize-Zustand warten lassen könnte, und das Laden der Ressourcen beenden würde, bevor es mit der Initialisierung aller untergeordneten Komponenten fortfahren würde. Irgendwelche Ideen?

Antwort

0

Vielleicht machen Sie das Laden nicht von entfernten Ressourcen abhängig. Ihre App sollte sich leicht verschlechtern, wenn Sie über Ressourcen verfügen, die nicht rechtzeitig geladen werden oder gar nicht geladen werden.

Nichts external laden, bis alles initialisiert ist.

1

Sie haben Ihre Methoden in einer bestimmten Art und Weise an der Kette, können Sie einfach tun, dass auf folgende Weise (dieser Code ist nicht getestet):

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
    preinitialize="onPreInitialize();" 
    creationComplete="onCreationComplete()"> 
    <mx:Script> 
     <![CDATA[ 

      private function onPreInitialize():void { 
       addEventListener("RemoteResourceLoaded", remoteResourceLoaded); 
       loadARemoteResource(); 
      } 
      private function loadRemoteResource():void { 
       // ... 
      } 

      private var _created:Boolean = false; 

      private function onCreationComplete():void { 
       // whatever you have here move it to the runTheApp() method... 
       _created = true; 
       runTheApp(); 
      } 

      private var _resourcesReady:Boolean = false; 

      private function remoteResourceLoaded(event:Event):void { 
       // process your resources... 
       _resourcesReady = true; 
       runTheApp(); 
      } 

      // this method will be called once the app is created 
      // and once when your resources are loaded 
      // 
      // 1: 
      // if app is created before resources are loaded its body 
      // is not going to be executed as _resourcesReady flag is false 
      // when resources are loaded it will then be called again 
      // and the body will be executed 
      // 
      // 2: 
      // if the resources are loaded before the app is created 
      // (during debugging?) it's gonna be called once but the 
      // _created flag is still false so the body is not processed 
      // when creationComplete fires both _created is set to true 
      // and method is called again, both conditions are true 
      // and the body gets executed 

      private function runTheApp():void { 
       if (_resourcesReady && _created) { 
        // now the app is fully created and resources are loaded 
       } 
      } 

     ]]> 
    </mx:Script> 
</mx:Application> 

Dies zeigt die allgemeine Idee, aber ich denke, es ist Ihre Antworten Frage. Im Allgemeinen ist es wichtig, auf die Ressource zu warten, wenn es lange dauert, bis creationComplete korrekt geladen und verarbeitet wird, wenn die Ressource vor dem Start von creationComplete geladen wird.

Hoffe, das hilft.