Actionscript 3 и mxml ... блокируются во время ожидания события - PullRequest
0 голосов
/ 12 июня 2009

Я пишу компонент mxml

<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>

В моем компоненте есть некоторые теги mxml, которые ссылаются на переменные из удаленного ресурса. Это приводит к ошибкам нулевой ссылки, потому что flex пытается загрузить все компоненты mxml до загрузки удаленного ресурса. Мне бы понравилось, если бы я мог заставить flex ждать в его состоянии предварительной инициализации и завершить загрузку ресурсов, прежде чем перейти к инициализации всех дочерних компонентов. Есть идеи?

Ответы [ 2 ]

1 голос
/ 19 июня 2009

Вы должны связать свои методы определенным образом, вы можете легко сделать это следующим образом (этот код не тестировался):

<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>

Это показывает общую идею, но я думаю, что она отвечает на ваш вопрос. Как правило, это вопрос ожидания ресурса, если для загрузки и обработки creationComplete требуется много времени, если ресурс загружен до запуска creationComplete.

Надеюсь, это поможет.

0 голосов
/ 12 июня 2009

Возможно, не делайте загрузку зависимой от удаленных ресурсов. Ваше приложение должно постепенно ухудшаться, если у вас есть ресурсы, которые не загружаются вовремя или вообще не загружаются.

Не загружайте ничего внешнего, пока все не будет инициализировано.

...