【问题标题】:Accessing a class from an externally loaded Flex SWF从外部加载的 Flex SWF 访问类
【发布时间】:2011-04-27 01:46:28
【问题描述】:

使用 Flex 4,我创建了一个具有以下代码的 SWF:

<fx:Script>
    <![CDATA[

        import mx.events.FlexEvent;
        import com.Index ;

        protected function start(event:FlexEvent):void
        {
            this.addElement (new Index());
        }
    ]]>

我想要做的是将 SWF 加载到另一个 SWF 中并访问此类。问题是 Flex 类 Main 是加载 SWF 所识别的。我曾尝试访问其子项(元素),但添加的项目不存在。

我的最终目标是加载一个 SWF,其中包含一个可以与加载的 SWF 交互的对象。

加法:

感谢您的补充。该代码现在可以工作,但它只访问由 MXML 创建的 Flex 类。这是完整的 MXML:

<?xml version="1.0" encoding="utf-8"?>

           width="1000"
           height="700"
           creationComplete="start(event)"
           >

<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>

<fx:Script>
    <![CDATA[

        import mx.events.FlexEvent;
        import Test;

        protected function start(event:FlexEvent):void
        {
            this.addElement(new Test ());
        }
    ]]>

为了尝试提取 Test 类,我执行了以下操作:

var MainC:Class = L.contentLoaderInfo .applicationDomain .getDefinition ("Main.Test") as Class;
        var O:Object = new MainC();

这将返回“错误 #1065:未定义变量测试。”

如果我使用 ...getDefinition("Test"),我会得到相同的结果。

如果我使用 ....getDefinition("Main"),它可以正常工作。但我似乎无法进入它创建的类来提取任何东西。

【问题讨论】:

    标签: apache-flex


    【解决方案1】:

    最好的方法是将 swf 作为库 (swc) 并将其链接到您的项目。这样你就可以实现强类型,并访问底层类。

    如果你既不能访问 swf 对象的库版本,也不能访问你自己构建 swc 库的源,你仍然可以使用外部类,但不能使用强类型:

    var ExtIndex : Class = loader.contentLoaderInfo.applicationDomain.getDefintiion("Index");
    var instance : Object = new ExtIndex();
    this.addElement(instance);
    

    所以你必须将你的instance 定义为对象。

    虽然,如果你的 swf 中的 Index 类实现了你知道的 interface(你的项目中有它),比如 I_Index,你可以使用它来代替 Object

    var instance : I_Index = new ExtIndex();
    this.addElement(instance);
    

    您可能还会在决定走哪条路时找到this article useful

    更新 1

    在 Flex 中声明 loader

    var loader: flash.display.Loader;
    [...]
    var ExtIndex: Class = loader.contentLoaderInfo.applicationDomain.
        getDefinition("your.package.Index") as Class;
    

    如果您的包中有 Index 类(默认值除外),您应该在其名称中指定它。上面的代码在your/package 包中搜索Index 类。

    API 文档getDefinition

    从 指定的应用程序域。这 定义可以是一个类,一个 命名空间或函数。

    参数:
    name 定义的名称。
    返回:与定义关联的对象。
    抛出ReferenceError - 不存在具有指定名称的公共定义。

    语言版本:3.0
    播放器版本:Flash 9、AIR 1.0

    更新 2
    要通过加载包含它的 swf 使您的外部应用程序中定义的 Test 类可从其他 flex 应用程序访问,您必须在您的 swf 的主应用程序中声明一个具有该类型的变量。否则,该类将不会被编译到 swf 中(以节省它的大小)。
    Flex 仅将实际使用的类编译到 swf 中,因此仅导入一个类是不够的。
    在 main申请您​​的瑞士法郎,您应该声明:

    var _tmp:Index;
    

    这确保Index 类将被编译到您的 swf 中,并且您可以从加载该 swf 的其他应用程序访问它。

    更新 3
    你可以在this link 看看它是如何工作的。源代码也包括在内。

    由于有两个项目,在[src]文件夹中可以看到测试的源码,在[source path src]文件夹中可以看到外部加载的swf文件的源码。
    如果您下载整个项目,请确保将两个项目分开。

    【讨论】:

    • 您好,感谢您的评论。但是,我在 var ExtIndex : Class... 行中收到一个错误,指出您无法将对象转换为类。当我追踪它时,它得到的是 SystemManager,而不是索引类。
    • 你好,我又试了。但是,我说 getDefinition 的 Loader 类不是有效的调用。有趣的事情...当我在 MovieClip 中使用 Loader.ContentLoaderInfo.applicationDomain 时,它工作正常,但是当我在 Flex 中尝试时,我只能到达 Loader.contentLoaderInfo 没有 applicationDomain,但错误是问题出在使用 getDefinition。李
    • 查看我的更新,如果您有问题,请粘贴一些堆栈跟踪
    • 您好,感谢您的帮助。我用一些新信息更新了我的帖子。
    • 如果您的 Test 类位于名为 Main 的包中,您应该使用 "Main.Test"!请参阅我的更新以了解如何消除 Variable not defined 错误。
    猜你喜欢
    • 2011-10-04
    • 2014-04-21
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 2012-03-31
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多