用FLEX來開發應用難免不了要使用到Module,FLEX組件提供了ModuleLoader組件,該組件使用方式類似與swfLoader,但是通常僅僅使用該組件並不能滿足我們的需求,這時FLEX為我們提供了ModuleManager,可以實現動態載入不同的模組。
module分為兩種,一種是完整的,一種是關聯到主程式的,在建立Module時可以選擇module swf size
1.完整的module會將所有用到的引用編譯進來因而比較大,這個一般會比較少用到。
2.關聯到主程式的則不會將主程式的引用編譯進來,因而會比較小,但是引用別的模組就不同了。
在使用FLEX模組時有幾點需要注意的地方
1.module內不可以訪問別的module的對象但是可以訪問主程式的對象引用
2.不要在主程式中建立模組的引用,這樣模組還是會被載入到主程式中,模組的意義也就沒了。
3.module內的組件的初始化實在ModuleEvent.READY事件之後,所以不能在ModuleEvent.READY事件裡直接存取module內的組件
為了在主程式中使用module對象來操作module內的一些行為,這時可以將module對象在主程式中轉換成object類型,然後儲存引用,或者讓module實現一個介面,然後儲存該介面的引用。
然而使用object類型無法知道內部公開的方法,但使用介面就沒有此問題
在使用FLEX提供的動態載入module功能時我們需要用到一下3個類
ModuleManager,IModuleInfo,ModuleEvent
ModuleManager 內有一個管理各個module的map,ModuleManager 在載入module之前會判斷他是否已經存在,如果存在則不會再次載入通過ModuleManager.getModule(URL)方法我們可與擷取到ModuleManager的內部類ModuleInfoProxy的對象,ModuleInfoProxy實現了IModuleInfo介面,因此我們可以通過IModuleInfo介面來儲存ModuleInfoProxy內部類的對象對象進行系列的操作。
有關ModuleManager,IModuleInfo,ModuleEvent的詳細資料見協助文檔。
如何動態載入module:
1.通過ModuleManager.getModule(URL)擷取與特定 URL 關聯的 IModuleInfo 介面。
_moduleInfo=ModuleManager.getModule("com/myMusic/nominateMusicModule/NominateMusic.swf");
2.為載入module的各個過程添加事件監聽
_moduleInfo.addEventListener(ModuleEvent.READY, onModuleReady);
_moduleInfo.addEventListener(ModuleEvent.SETUP, onModuleSetup);
_moduleInfo.addEventListener(ModuleEvent.UNLOAD, onModuleUnload);
_moduleInfo.addEventListener(ModuleEvent.PROGRESS, onModuleProgress);
3.調用loader方法執行載入動作
_moduleInfo.load(); //載入Module
對於一個較大型的Flex RIA應用,產生的 swf檔案的體積必然不會小, 在中國這樣艱苦的網路環境下面,不得不考慮如何讓使用者減少等待的時間. 這樣就需要把一個大的Flex程式分成各個不同的功能組件, 每個Module單獨編譯成一個 SWF ,需要的時間,再動態載入調用.減小主程式的體積.
具體的做法是:
使用 mx.modules.ModuleLoader 可以進行Module動態載入.