从外部加载的Flex SWF访问类

时间:2011-04-23 06:25:09

标签: flex

使用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”),它可以正常工作。但我似乎无法进入它创造的类以提取任何东西。

1 个答案:

答案 0 :(得分:3)

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

如果您既无法访问swf对象的库版本,也无法访问构建sws库yourserlf的源代码,您仍然可以使用外部类,但不能使用强类型:

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类(默认值除外),则应在其名称中指定它。上面的代码会搜索Index包中的your/package类。

getDefinition

API文档

  

从中获取公共定义   指定的应用域。该   定义可以是类的定义,a   命名空间或函数。

<强>参数:
name定义的名称。
返回:与定义关联的对象 引发ReferenceError - 没有指定名称的公共定义。

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

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

var _tmp:Index;

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

更新3
您可以在this link查看其工作原理。源代码也包含在内。

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