使用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”),它可以正常工作。但我似乎无法进入它创造的类以提取任何东西。
利
答案 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文件的源。
如果您下载整个项目,请确保将两个项目分开。