D.P.S项目的几个功能模块完全基于Module。
Module被创建后如何引用,主要有两种方法:
一、ModuleLoader
1.1 在MXML中引用
<mx:ModuleLoader url="MXMLDemoModule.swf" /> //可以通过设置或改变url来载入新的module
1.2actionScript中引用
ModuleLoader .loadModule();
二、ModuleManager
这也是在项目中用到的方法,利用ModuleManager类来加载Module模块。这种方式比起纯粹的ModuleLoader方式稍微复杂一点,但是 ModuleManager提供了比ModuleLoader更加强大的能力来管理Module模块的加载过程。流程为:
通过ModuleManager实例的getModule()方法拿到Module模块的一个索引,索引类型为IModuleInfo。
调用这个索引的load()方法。 此时Module已经加载到缓存上了,但是UI中没有显示出来。
利用这个接口的factory属性拿到它相关连的Module工厂,调用此工厂的create()方法,并将返回值强制转换成当前的Module 类型。此时引入到某一容器中即可显示了
如:moduleContainter.addChild(info.factory.create() as module);
在D.P.S项目中moduleContainter.addChild(module as LayoutContainer);
mainapp
<textarea cols="50" rows="15" name="code" class="c-sharp"><?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()" layout="vertical" xmlns:common="dps.component.common.*" backgroundGradientAlphas="[1.0, 1.0]" backgroundGradientColors="[#FFFFFF, #000000]"> <mx:Style source="css/BlueOffice.css"/> <mx:Style source="css/VRM.css"/> <mx:Script> <!--[CDATA[ import dps.component.tenant.TenantAddView; import mx.managers.PopUpManager; import mx.events.CloseEvent; import mx.containers.TitleWindow; import mx.core.UIComponent; import dps.util.DPSUtil; import dps.model.LocationEntityBean; import dps.model.PrinterEntityBean; import dps.service.PrinterService; import dps.service.ConfigurationService; import dps.core.config.DataSourceConfiguration; import mx.collections.ArrayCollection; import dps.model.RoleEntityBean; import dps.control.CommonControl; import mx.controls.Alert; import mx.core.LayoutContainer; import mx.modules.ModuleBase; import mx.managers.PopUpManager; import mx.core.Application; import mx.events.DynamicEvent; import mx.events.ModuleEvent; import mx.modules.IModuleInfo; import mx.modules.ModuleManager; import module.IModuleInterface; //public var info:IModuleInfo; private var management:ManagementModule; private var monitor:MonitorModule; private var report:ReportModule; private var tenant:TenantModule; private var blueOffice:UIComponent; [Bindable]private var info:IModuleInfo; private static var loginUser:RoleEntityBean; public function init():void { //buttonBar.groupNameArray4Admin=["Monitoring","Reporting","Printer Management"]; buttonBar.addEventListener("groupTabChange",onGroupTabChange); DataSourceConfiguration.init(initFunction); function initFunction():void { var loginUserId:String = ""; try { loginUserId = (Application.application.parameters["id"]); } catch(e:Error) { Alert.show("XXX"); } CommonControl.getInstance().getLoginUser(loginUserId,callback); function callback(roles:ArrayCollection):void { if(roles != null) { if(roles.length>1) { tenantCombo.visible = true; } tenantCombo.dataProvider = roles; tenantCombo.labelField = "tenantUID"; loginUser = roles[0]; buttonBar.tabArr = loginUser.authorityList; loadModule("MonitorModule.swf",loginUser); } } } } private function loadModule(path:String,initParams:Object = null):void { info = ModuleManager.getModule(path); info.addEventListener(ModuleEvent.READY, modEventHandler); info.addEventListener(ModuleEvent.ERROR, errorHandler); info.load(ApplicationDomain.currentDomain); progressBar.visible = true; function errorHandler(e:ModuleEvent):void { Alert.show(e.errorText.toString()); info.removeEventListener(ModuleEvent.ERROR,errorHandler); } function modEventHandler(e:ModuleEvent):void { var module:* = info.factory.create() as Object; var moduleName:String = (module["getModuleName"] as Function).call(); if(moduleName == "ManagementModule") { management = module; } if(moduleName == "MonitorModule") { monitor = module; } if(moduleName == "ReportModule") { report = module; } if(moduleName == "BlueOfficeMapModule") { blueOffice = module; } if(moduleName == "TenantModule") { tenant = module; } if(moduleName != "BlueOfficeMapModule") { moduleContainter.addChild(module as LayoutContainer); } else { showEOfficeWindow(blueOffice); } (module["init"] as Function).call(null,initParams); info.removeEventListener(ModuleEvent.READY,modEventHandler); progressBar.visible = false; } } private var titleWindow:TitleWindow; private function showEOfficeWindow(module:UIComponent):void { if(titleWindow == null) { titleWindow = new TitleWindow(); titleWindow.title = "E-Office"; titleWindow.showCloseButton = true; titleWindow.width = 800; titleWindow.height = Application.application.height*0.8; titleWindow.verticalScrollPolicy = "off"; titleWindow.horizontalScrollPolicy = "off"; titleWindow.addChild(module); titleWindow.addEventListener(CloseEvent.CLOSE,eofficeCloseHandler); PopUpManager.addPopUp(titleWindow,Application.application as DisplayObject); titleWindow.x = (Application.application.width - titleWindow.width)/2; titleWindow.y = (Application.application.height - titleWindow.height)/2; function eofficeCloseHandler(e:CloseEvent):void { PopUpManager.removePopUp(titleWindow); titleWindow = null; } } } public function onGroupTabChange(event:DynamicEvent):void { var tabName:String = event["groupTabName"] as String; switch (tabName) { case "Printer Management": if(management == null) { loadModule("ManagementModule.swf",loginUser); } else { management.visible = management.includeInLayout = true; } if(monitor != null) { monitor.visible = monitor.includeInLayout = false; } if(report != null) { report.visible = report.includeInLayout = false; } if(blueOffice != null) { blueOffice.visible = blueOffice.includeInLayout = true; } if(tenant != null) { tenant.visible = tenant.includeInLayout = false; } break; case "Monitoring": if(monitor == null) { loadModule("MonitorModule.swf",loginUser); } else { monitor.visible = monitor.includeInLayout = true; } if(management != null) { management.visible = management.includeInLayout = false; } if(report != null) { report.visible = report.includeInLayout = false; } if(blueOffice != null) { blueOffice.visible = blueOffice.includeInLayout = false; } if(tenant != null) { tenant.visible = tenant.includeInLayout = false; } break; case "Reporting": if(report == null) { loadModule("ReportModule.swf",loginUser); } else { report.visible = report.includeInLayout = true; } if(management != null) { management.visible = management.includeInLayout = false; } if(monitor != null) { monitor.visible = monitor.includeInLayout = false; } if(blueOffice != null) { blueOffice.visible = blueOffice.includeInLayout = false; } if(tenant != null) { tenant.visible = tenant.includeInLayout = false; } break; case "Tenant Management": if(tenant == null) { loadModule("TenantModule.swf",loginUser); } else { tenant.visible = tenant.includeInLayout = true; } if(management != null) { management.visible = management.includeInLayout = false; } if(monitor != null) { monitor.visible = monitor.includeInLayout = false; } if(blueOffice != null) { blueOffice.visible = blueOffice.includeInLayout = false; } if(report != null) { report.visible = report.includeInLayout = false; } break; } } public function connectBlueOffice(location:LocationEntityBean):void { //var initParams:Object = {}; //initParams["path"] = "assets/maps/sh-3f-map.swf"; //initParams["location"] = "3g-1"; var locationParams:Object = DPSUtil.location2EOfficeMapPath(location); if(locationParams != null) { if(blueOffice!=null) { showEOfficeWindow(blueOffice); (blueOffice["init"] as Function).call(null,locationParams); } else { loadModule("BlueOfficeMapModule.swf",locationParams); } } else { Alert.show("E-Office does not support this building"); } } public function addTenantClick():void { var addTenant:TenantAddView = TenantAddView(PopUpManager.createPopUp(Application.application as DisplayObject,TenantAddView,true)); PopUpManager.centerPopUp(addTenant); } public function tenantChange(evt:Event):void { moduleContainter.removeAllChildren(); if(management) { management=null; } if(monitor) { monitor = null; } if(report) { report = null; } if(tenant) { tenant = null; } loginUser = tenantCombo.selectedItem as RoleEntityBean; buttonBar.tabArr = loginUser.authorityList; loadModule("MonitorModule.swf",loginUser); progressBar.visible = false; } ]]--> </mx:Script> <mx:Canvas width="100%"> <common:GroupButtonBarView id="buttonBar" width="100%"></common:GroupButtonBarView> <mx:HBox width="100%" horizontalAlign="right"> <mx:ComboBox id="tenantCombo" change="tenantChange(event)" visible="false"/> <mx:Button label="Add Tenant" click="addTenantClick()"/> </mx:HBox> </mx:Canvas> <mx:VBox id="moduleContainter" width="100%" height="100%"> </mx:VBox> <mx:ProgressBar id="progressBar" source="{info}" horizontalCenter="0" verticalCenter="0" color="0x333333" fontWeight="normal"/> </mx:Application> </textarea>
GroupButtonBarView中
<textarea cols="50" rows="15" name="code" class="c-sharp"><?xml version="1.0" encoding="utf-8"?> <mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" verticalGap="0" verticalAlign="middle"> <!--<mx:Script source="../../../asset/Image.as"/>--> <mx:Script> <!--[CDATA[ import mx.collections.ArrayCollection; import mx.events.DynamicEvent; import mx.events.ItemClickEvent; [Bindable]private var linkBarSelectedIndex:int = 0; private function linkBarItemClickHandler(evt:ItemClickEvent):void { linkBarSelectedIndex = evt.index; linkBar.dataProvider=null; linkBar.dataProvider=groupNameArray4Admin; linkBar.selectedIndex=linkBarSelectedIndex; var dyEvent:DynamicEvent = new DynamicEvent("groupTabChange"); dyEvent.groupTabName = evt.label; dispatchEvent(dyEvent); } public function set tabArr(tabs:ArrayCollection):void { groupNameArray4Admin = tabs; } //[Bindable]public var groupNameArray4Admin:Array = ["Monitoring"]; [Bindable] public var groupNameArray4Admin:ArrayCollection = new ArrayCollection( [ { authorityName: "Monitoring", responseTime: 100}]); [Bindable] public var groupNameArray4Admin1:ArrayCollection = new ArrayCollection( [ { authorityName: "Monitoring", responseTime: 100}]); ]]--> </mx:Script> <mx:Metadata> [Event(name="groupTabChange",type="flash.events.DynamicEvent",bubbles="true",cancelable="true")] </mx:Metadata> <!--linkButtonStyleName="blueTabButton"--> <mx:HBox width="100%"> <mx:LinkBar id="linkBar" linkButtonStyleName="blueTabButton" selectedIndex="{linkBarSelectedIndex}" itemClick="linkBarItemClickHandler(event)" dataProvider="{groupNameArray4Admin}" labelField="authorityName" separatorWidth="0" paddingTop="0" paddingBottom="0" /> <mx:Spacer width="100%"/> <!--<mx:ComboBox dataProvider=""></mx:ComboBox>--> </mx:HBox> <mx:HRule id="blueHRule" width="100%" strokeColor="#61b3f5" shadowColor="#61b3f5"/> </mx:VBox> </textarea>
info.addEventListener(ModuleEvent.READY, modEventHandler);
Module加载完毕再执行modEventHandler,因此针对Module的操作应该放在modEventHandler中,对module的操作不能和info = ModuleManager.getModule(path);放在一起,
info.load(ApplicationDomain.currentDomain);从缓存中引入
然后在modEventHandler对module执行操作
var module:* = info.factory.create() as Object;
var moduleName:String = (module["getModuleName"] as Function).call();
这是回调moudle中的 getModuleName方法,语法为 (module["getModuleName"] as Function).call();
(module["init"] as Function).call(null,initParams);
再调用module中的init方法实现初始化和传参 initParams.
module代码示例:
<textarea cols="50" rows="15" name="code" class="c-sharp"><?xml version="1.0" encoding="utf-8"?> <mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" implements="module.IModuleInterface" layout="vertical" width="100%" height="100%" xmlns:monitor="dps.component.monitor.*"> <mx:Script> <!--[CDATA[ import dps.constant.DPSConstant; import dps.control.CommonControl; import dps.model.RoleEntityBean; import dps.model.DPSBuildingBean; import dps.core.proxy.HttpServiceDelegate; import dps.core.config.DataSourceConfiguration; import dps.service.PrinterService; import mx.rpc.remoting.Operation; import mx.rpc.remoting.RemoteObject; import mx.collections.ArrayCollection; import mx.rpc.events.FaultEvent; import mx.rpc.events.ResultEvent; import mx.rpc.http.HTTPService; import mx.controls.Alert; public static var loginUser:RoleEntityBean; public function showPrinterMonitor(args:String):void { Alert.show("show Printer Monitor"+":"+args) } public function getModuleName():String { return "MonitorModule"; } public function setData(data:Object):void { } public function init(initParams:Object = null):void { if(initParams is RoleEntityBean) { loginUser = initParams as RoleEntityBean; } else if(initParams is String) { DataSourceConfiguration.init(initFunction); function initFunction():void { CommonControl.getInstance().getLoginUser(initParams as String,getLoginUserHandler); function getLoginUserHandler(role:RoleEntityBean):void { loginUser = role; } } } layoutAfterInit(); } private function layoutAfterInit():void { monitorView.loginUser = loginUser ; monitorView.showChargedLocation(); } private function connectHandler(event:Event):void { Alert.show("connect successfully"); } private function dataHandler(event:ProgressEvent):void { } ]]--> </mx:Script> <monitor:MonitorView id="monitorView" width="100%" height="100%"> </monitor:MonitorView> </mx:Module> </textarea>
ps:谢谢郑老大的无私教导和http://flex-java-oracle.javaeye.com/blog/543139的作者,部分内容分引自二者