flex開發中將各個功能分解到模塊中,但在加載各個模塊的時候需要注意一下問題:
加載方法:
private function init():void
{
module = mx.modules.ModuleManager.getModule("UIModule/HR/Holiday/Config/frmHolidayMain.swf");
module.addEventListener(mx.events.ModuleEvent.READY,ready);
module.load();
// general=ModuleLoader(mx.managers.PopUpManager.createPopUp(this,ModuleLoader));
//
// general.url="test3.swf";
//
// general.loadModule();
}
private function ready(e:ModuleEvent):void
{
var moduleInfo:IModuleInfo = e.target as IModuleInfo
var wind:MDIWindow = new MDIWindow();
wind.addChild(moduleInfo.factory.create() as DisplayObject);
testcanvas.windowManager.add(wind);
}
需要注意的一點是 module 對象的定義一定要定義為全局的否則ready事件是不能執行的。具體原因不知道,個人理解為到ready方法中無法找到module對象了
flex 裝載多個module出現的問題Error #1034: 強制轉換類型失敗 收藏
摘自http://bzhang.javaeye.com/blog/322148
TypeError: Error #1034: 強制轉換類型失敗:無法將 Object@1aee90b1 轉換為 mx.messaging.messages.IMessage。
需求背景 :
通過樹形菜單加載多個不同的module。
問題現象 :module頁面存在拖動,Popup,Alert或者colorpicker出現錯誤信息:
TypeError: Error #1034: 強制轉換類型失敗:無法將 mx.managers::PopUpManagerImpl@7155ac1 轉換為 mx.managers.IPopUpManager。
解決方案 :
在Application加入如下代碼引用:
< mx:Script >
<! [CDATA[
import mx.managers.DragManager;
import mx.managers.IPopUpManager;
/* Create dummy variables. */
// 避免出現:無法將 mx.managers::PopUpManagerImpl@52a09a1 轉換為 mx.managers.IPopUpManager 錯誤
private var dragManager : DragManager;
private var popUpManager : IPopUpManager;
//process....
]]>
</mx:Script>
問題原因分析 :
屬于ModuleLoader shared code problem .
當Module中使用managers時(如PopUpManager,DragManager, HistoryManager等)則可能出現這個問題(當application里在loader之前沒有引入這些manager的引用時)。
manager 的方法是靜態方法,整個應用程序中創建了一個該manager接口的singleton實例,但module僅在自己的 Application domain中使用該單例, 當多個module使用同一個單例manager且main application沒有使用時,就會出現這個空對象引用問題:第一個引入某manager的module不能將該manager接口的 singleton跟其他module共享,其他module調用該Manager的方法時,應用程序不會再創建該manager接口的實例,這個 module就無法引用到該manager接口的實例,就出現了空對象引用問題.
參考資料:Flex sdk源碼。
目前在Application創建了些Application范圍內沒有使用到的"木偶變量",從代碼可讀性上來說不是很好。有其他比較好的解決方案的同學麻煩請告之下,:)
posted on 2008-11-22 17:33 鉤子 閱讀(1118) 評論(1) 編輯 收藏 所屬分類: jee 、ria 、工作筆記
<noscript type="text/javascript"> //<![CDATA[ Sys.WebForms.PageRequestManager._initialize('AjaxHolder$scriptmanager1', document.getElementById('Form1')); Sys.WebForms.PageRequestManager.getInstance()._updateControls(['tAjaxHolder$UpdatePanel1'], [], [], 90); //]]> </noscript>
Feedback
# re: FLEX:multiple moduleloader occur #1034 error 2008-11-24 10:14 鉤子
同事推薦了個更好的辦法:
在ModuleLoader 的creationComplete方法中加入如下代碼:
moduleLoader.applicationDomain = ApplicationDomain.currentDomain;
就可以在Application里切換多個module而不需要在Application里明文引用單例manager聲明。比我上面所說的方法更好的能解決問題而且,代碼可讀性更好。
另外,推薦在moduleloader做切換的時候,加上:
moduleLoader.unloadModule再做moduleLoader.loadModule().
在這里做個小記。
http://blog.csdn.net/yzsind/archive/2009/03/27/4031066.aspx