Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   как обратиться к функции во flex module (http://www.flasher.ru/forum/showthread.php?t=134275)

tananuka 25.12.2009 13:50

как обратиться к функции во flex module
 
Итак я создаю флекс проект
а в нем делаю флекс модули..
Потом захожу в свой актион скрипт проект
и подгружаю флекс модули из другой флешки, и пытаюсь вызвать функцию внутри них, но не могу...
выдает такую ошибку:
Код:

ReferenceError: Error #1069: Не удалось найти свойство init в _Login_mx_core_FlexModuleFactory; отсутствует значение по умолчанию.
        at Main/modLoadComplet()[D:\tananuka\GTG_4\SkyLand\src\Main.as:121]

Вот как выглядит мой модуль упрощенно:
Код AS3:

<?xml version="1.0" encoding="utf-8"?>
<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="400" height="226" backgroundColor="#9FB3BF">
    <mx:Script>
      <![CDATA[
    public function init():void
      {
        trace('INIT')
      }
      ]]>
    </mx:Script>
</mx:Module>

Вот так я его гружу и пытаюсь выполнить функцию инит()
Код AS3:

swfLoader = new Loader();
swfLoader.load(new URLRequest(url))
swfLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, modLoadComplet);
private function modLoadComplet(_event:Event):void
{
        var module:Object = _event.target.loader.content as Object;
        module.init(this)
}


erectus 25.12.2009 15:07

проще воспользоваться флексовским классом mx.modules.ModuleLoader

ну а если не хочется, то можно посмотреть как в нем реализована загрузка модулей. Я тут выдрал пару кусков, надеюсь поможет разобраться:
Код AS3:

var factoryInfo : IFlexModuleFactory;
 
loader.contentLoaderInfo.removeEventListener(Event.INIT, initHandler);
 
    public function initHandler(event:Event):void
    {
        factoryInfo = new FactoryInfo();
 
        try
        {
            factoryInfo.factory = loader.content as IFlexModuleFactory;
        }
        catch(error:Error)
        {
        }
 
        if (!factoryInfo.factory)
        {
        // .....
        // опускаем подробности
        // ....
            return;
        }
 
        loader.content.addEventListener("ready", readyHandler);
        loader.content.addEventListener("error", moduleErrorHandler);
 
        try
        {
            factoryInfo.applicationDomain =
                loader.contentLoaderInfo.applicationDomain;
        }
        catch(error:Error)
        {
        }
 
        // .....
        // опускаем подробности
        // ....
 
    }
 
    public function readyHandler(event:Event):void
    {
        var module:DisplayObject = factoryInfo.create() as DisplayObject;
        // а теперь можно вызывать init()
        module.init();
    }

Смысл в том, что Event.COMPLETE означает что файл с модулем закончил грузиться, но это еще не модуль, это просто данные в буфере лоадера. Потом запускается процесс имициализации. Когда он заканчивается (Event.INIT) загруженные данные уже интерпретированы как определенный набор классов.

PS: приведенный код сам не проверял... я использую ModuleLoader

tananuka 25.12.2009 17:04

подгружать получилось, но
Код AS3:

                swfLoader = new Loader();
                var request:URLRequest = new URLRequest('url.swf');
                swfLoader.load(request)
 
                private function modLoadComplet(_event:Event):void
                {
                        var module:Object = _event.target.loader.content
                        if (module is IFlexModuleFactory)
                        {
                                module.addEventListener('ready', initFlexMod);
                        }                       
                }
                private function initFlexMod(_event:Event):void
                {
                        var module:Object = _event.target.create() as Object;
                        module.init(this)
                }

Добавлено через 2 часа 41 минуту
после того как я подгрузил флекс модуль, его визуальные компоненты равны null
если вызвать функцию initialize() в флекс модуле после загрузки, для инициализации компонентов, то выдает ошибку в моем актион скрипт проекте(((
помогите...

мне кажется свфки созданые в флекс и актион проектах не совместимы =(

erectus 28.12.2009 21:38

а может стоит попробовать в модуле при инициализации сгенерировать событие. На которое подписаться в падгружающем проекте
Код AS3:

<mx:Module initialize="init();">
    <mx:Script>
      <![CDATA[
      private function init():void
      {
        trace("INIT");
        dispatchEvent(new Event("MyEvent"));
      }
 
      public function func() : void
      {
      trace("FUNC");
      }
      ]]>
    </mx:Script>
</mx:Module>
>

Код AS3:

        private function initFlexMod(_event:Event):void
        {
                var module:Object = _event.target.create() as Object;
                module.addEventListener("MyEvent", onModuleInit);
        }
 
        private function onModuleInit(_event:Event):void
        {
          event.target.func();
        }

и интересно в трейсе вообще появится строчка 'INIT'? если нет, нужно искать другой способ

NePridymal 29.12.2009 16:47

Если нужно грузить модули именно swfLoader-омБ то проще всего скормить загруженные байты классу ModuleLoader и с помощью этого скласса уже размножать и использовать загруженные модули:

Код:


var modContainer:ModuleLoader

protected function onLoadComplete(event:Event):void
{
                               
  var swfLoader:SWFLoader = event.target as SWFLoader;
  if (swfLoader.content is IFlexModuleFactory && !(swfLoader.content is ISystemManager))
    { 
       
        modContainer = new ModuleLoader();
        modContainer.addEventListener(ModuleEvent.READY,onModuleReady);
        modContainer.loadModule("someName",swfLoader.content.loaderInfo.bytes);                                     
    }
}

protected function onModuleReady(e:ModuleEvent):void
{
       
    var targetClass:Class = Object(modContainer.child).constructor;
    var duplicate:DisplayObject = new targetClass() as DisplayObject;

    // делайте с модулем что хотите. Он находится в duplicate;                                                                       
}



Часовой пояс GMT +4, время: 13:40.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.