Просмотр полной версии : как обратиться к функции во flex module
tananuka
25.12.2009, 13:50
Итак я создаю флекс проект
а в нем делаю флекс модули..
Потом захожу в свой актион скрипт проект
и подгружаю флекс модули из другой флешки, и пытаюсь вызвать функцию внутри них, но не могу...
выдает такую ошибку:
ReferenceError: Error #1069: Не удалось найти свойство init в _Login_mx_core_FlexModuleFactory; отсутствует значение по умолчанию.
at Main/modLoadComplet()[D:\tananuka\GTG_4\SkyLand\src\Main.as:121]
Вот как выглядит мой модуль упрощенно:
<?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>
Вот так я его гружу и пытаюсь выполнить функцию инит()
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)
}
проще воспользоваться флексовским классом mx.modules.ModuleLoader
ну а если не хочется, то можно посмотреть как в нем реализована загрузка модулей. Я тут выдрал пару кусков, надеюсь поможет разобраться:
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
подгружать получилось, но
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() в флекс модуле после загрузки, для инициализации компонентов, то выдает ошибку в моем актион скрипт проекте(((
помогите...
мне кажется свфки созданые в флекс и актион проектах не совместимы =(
а может стоит попробовать в модуле при инициализации сгенерировать событие. На которое подписаться в падгружающем проекте
<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>
>
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;
}
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.