Проблема приведения к интерфейсу в flex - PullRequest
2 голосов
/ 22 сентября 2011

Я использую интерфейсы для связи модулей, как в документация Adobe Flex . Когда у меня есть ModuleLoader в mxml, все отлично работает.

<mx:TabNavigator id="testNav"
                height="100%"
                width="100%">
        <s:ModuleLoader id="firstTab" 
                        label="ONE" 
                        width="100%"
                        url="path/to/module/Mod1.swf"/>

        <s:ModuleLoader id="secondTab"
                        label="TWO" 
                        width="100%"
                        url="path/to/module/Mod2.swf"/>


</mx:TabNavigator>

и у меня есть этот код

var someChild:* = firstTab.child as ISomeModule;

ISomeModule - интерфейс. Но когда у меня есть ModuleLoader в ActionScript в другом файле, когда я делаю то же самое, someChild становится нулевым, когда приведен к ISomeModule

var myLoader:ModuleLoader=new ModuleLoader();
myLoader.percentHeight=50;
myLoader.percentWidth=50;
myLoader.loadModule(moduleURL + "?attr=value&attr2=" + parentDocument.attr2);

а в другой функции у меня

var childMod:* = myLoader.child as ISomeModule;

myLoader.child не является нулевым, но при приведении к ISomeModule становится нулевым. У кого-нибудь есть идеи о том, как это решить? спасибо

Ответы [ 2 ]

3 голосов
/ 23 сентября 2011

2 вещи:

  • Вам нужен тот же ApplicationDomain для совместного использования классов между модулями (вы также должны включить оптимизацию в вашей компиляции модуля): <s:ModuleLoader url="someURL" applicationDomain="{ApplicationDomain.currentDomain}" />
  • Если я правильно помню, это должно быть firstChild.content, а не firstChild.child для самого модуля.
0 голосов
/ 24 февраля 2016

Этому посту уже несколько лет, но в настоящее время я столкнулся с подобной проблемой, динамически создавая ModuleLoader с AS3. Приведенный выше совет, чтобы установить ApplicationDomain спас мой день ... спасибо!

private function createModule():void {
    _moduleLoader = new ModuleLoader;
    _moduleLoader.applicationDomain = ApplicationDomain.currentDomain;
    _moduleLoader.addEventListener(ModuleEvent.READY, onModuleReady);
    _moduleLoader.url = "path/to/your/module/MyModule.swf";
    _moduleLoader.loadModule();
}

private function onModuleReady(event:ModuleEvent):void {
    // iMyModule is null if ApplicationDomain is not set
    var iMyModule:* = event.currentTarget.child as IMyModule;
}

Спасибо, Olaf

...