2009-09-24 131 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作爲一個基本對象,然後你可以調用這個對象的方法。

請讓我知道,如果這有效,如果沒有,我明天可以改進它。