Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Flex

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 25.12.2009, 13:50
tananuka вне форума Посмотреть профиль Отправить личное сообщение для tananuka Найти все сообщения от tananuka
  № 1  
Ответить с цитированием
tananuka
 
Аватар для tananuka

Регистрация: Jul 2007
Сообщений: 80
По умолчанию как обратиться к функции во 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)
}


Последний раз редактировалось tananuka; 25.12.2009 в 20:38.
Старый 25.12.2009, 15:07
erectus вне форума Посмотреть профиль Отправить личное сообщение для erectus Найти все сообщения от erectus
  № 2  
Ответить с цитированием
erectus

Регистрация: Dec 2009
Сообщений: 25
проще воспользоваться флексовским классом 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

Старый 25.12.2009, 17:04
tananuka вне форума Посмотреть профиль Отправить личное сообщение для tananuka Найти все сообщения от tananuka
  № 3  
Ответить с цитированием
tananuka
 
Аватар для tananuka

Регистрация: Jul 2007
Сообщений: 80
подгружать получилось, но
Код 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() в флекс модуле после загрузки, для инициализации компонентов, то выдает ошибку в моем актион скрипт проекте(((
помогите...

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


Последний раз редактировалось tananuka; 25.12.2009 в 20:13.
Старый 28.12.2009, 21:38
erectus вне форума Посмотреть профиль Отправить личное сообщение для erectus Найти все сообщения от erectus
  № 4  
Ответить с цитированием
erectus

Регистрация: Dec 2009
Сообщений: 25
а может стоит попробовать в модуле при инициализации сгенерировать событие. На которое подписаться в падгружающем проекте
Код 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'? если нет, нужно искать другой способ

Старый 29.12.2009, 16:47
NePridymal вне форума Посмотреть профиль Отправить личное сообщение для NePridymal Найти все сообщения от NePridymal
  № 5  
Ответить с цитированием
NePridymal
 
Аватар для NePridymal

Регистрация: Apr 2007
Сообщений: 143
Отправить сообщение для NePridymal с помощью ICQ
Если нужно грузить модули именно 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, время: 00:24.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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