2009-09-24 109 views
1

假设我有两个swfs A和B,并且在运行时swf A加载了swf B,并且我希望在它们之间共享代码,从而最大限度地减小文件大小和下载时间。在swfs之间共享代码

如果swf B有一些代码(比如说com.blah.HelloWorld),我告诉编译器在swf A的类路径中有swf B的源代码,但只做一个编译时链接,而不是实际编译com.blah。 HelloWorld转换为swf A.

这个工作,我试过了,使用-includes和-externs编译器选项。

但是,我的问题是,我希望以另一种方式做到这一点。即swf A和B(以及潜在的swf C)都需要com.blah.HelloWorld,但我希望com.blah.HelloWorld被编译为swf A,并将它作为swf B中的外部参考(并且可能也包含C) )

我尝试过使用externs并包含它,但是当我这样做时我得到ReferenceErrors。

我想这样做没有单独的rsl,所以我可以减少http请求的数量。 这可能吗?

+0

我想在这里http://stackoverflow.com/questions/1455144/circular-dependencies-in-flex-libraries做类似的事情 不幸的是我还没有找到如何去做 – Turambar 2009-09-24 17:04:53

回答

1

您可以将您的flex应用程序拆分为modules

或者您可以从使用ApplicationDomain类的getDefinition方法在运行时加载的SWF访问各个类:

var loader:Loader = new Loader(); 
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoad); 
loader.load(new URLRequest("c.swf")); 
//.. 
private function onLoad(e:Event):void 
{ 
    var domain:ApplicationDomain = LoaderInfo(e.target).applicationDomain; 
    var Type:Class = domain.getDefinition("pack.MyComponent") as Class; 
    var myBox:Sprite = new Type(); 
    addChild(myBox); 
} 
0

我不确定我是否理解你的问题,但我认为你可以使用AS3 Loader类来做你想做的事。格式会是这样的 - 比方说,我们正在创建您的主应用程序(将被称为“a.swf”),并且您想要访问已编译到另一个应用程序中的方法和属性(称为“b.swf” ),你会这样做:

var SWFB:Object; // empty at first as a placeholder. 

var url:URLRequest = new URLRequest("b.swf"); 
var l:Loader = new Loader(); 
l.contentLoaderInfo.addEventListener(Event.COMPLETE, loaded); 
l.load(url); 

function loaded(e:Event):void { 
SWFB = e.currentTarget.content as Object; 
initApp(); 
} 

function initApp():void { 
SWFB.someMethodCall(); 
} 

......我想这会工作。我现在无法测试它,但试试它并让我知道。基本上你将要加载b.swf作为一个基本对象,然后你可以调用这个对象的方法。

请让我知道,如果这有效,如果没有,我明天可以改进它。