【问题标题】:Problem casting to an interface in flex问题转换为 flex 中的接口
【发布时间】:2011-09-22 14:42:51
【问题描述】:

我正在使用adobe flex documentation 中的接口进行模块通信。当我在 mxml 中有一个 ModuleLoader 时,一切正常。

<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 是接口。 但是当我在另一个文件中的 actionscript 中有一个 ModuleLoader 时,当我做同样的事情时, someChild 在转换为 ISomeModule 时变为 null

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 时,它​​变为空。 有谁知道如何解决这个问题? 谢谢

【问题讨论】:

  • 您确定可以转换为接口吗?您不必强制转换为对象吗?变量类型可以是接口;但是您必须使用在运行时实现该接口的对象。假设这是错误的。你试过这个: IssomeModule(firstTab.child) 吗?您确定 firstTab [和 child] 具有有效值吗?它们可以为空吗?
  • 不,firstTab 和 child 没问题,我测试了它们并使用了我在 ISomeModule 中声明的函数,我只是在 official documentation 中做了类似的事情
  • 您在进行演员阵容时是否在调试器中查看了myLoader.child?调试器显示什么类型?它实现了你想要的接口吗?
  • 另外,当你说 ModuleLoader 是“在一个文件中”时,那个文件本身是一个模块吗?因为它有自己的域,所以它对您的接口的定义可能与您进行转换的定义不同。
  • @Gerhard 问题是由于很多原因我无法调试这个应用程序

标签: apache-flex actionscript-3 actionscript ria flex4.5


【解决方案1】:

两件事:

  • 您需要相同的 ApplicationDomain 用于跨模块类共享(您还应该在模块编译中启用优化):&lt;s:ModuleLoader url="someURL" applicationDomain="{ApplicationDomain.currentDomain}" /&gt;
  • 如果我没记错的话,实际模块本身应该是firstChild.content 而不是firstChild.child

【讨论】:

  • moduleLoader 没有属性内容
【解决方案2】:

这篇文章已经有好几年了,但目前我通过使用 AS3 动态创建 ModuleLoader 遇到了类似的问题。 上面设置 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;
}

谢谢, 奥拉夫

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    相关资源
    最近更新 更多