Module入门

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">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;mx:Application xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot; creationComplete=&quot;init()&quot; layout=&quot;vertical&quot; xmlns:common=&quot;dps.component.common.*&quot; backgroundGradientAlphas=&quot;[1.0, 1.0]&quot; backgroundGradientColors=&quot;[#FFFFFF, #000000]&quot;&gt; &lt;mx:Style source=&quot;css/BlueOffice.css&quot;/&gt; &lt;mx:Style source=&quot;css/VRM.css&quot;/&gt; &lt;mx:Script&gt; &lt;!--[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=[&quot;Monitoring&quot;,&quot;Reporting&quot;,&quot;Printer Management&quot;]; buttonBar.addEventListener(&quot;groupTabChange&quot;,onGroupTabChange); DataSourceConfiguration.init(initFunction); function initFunction():void { var loginUserId:String = &quot;&quot;; try { loginUserId = (Application.application.parameters[&quot;id&quot;]); } catch(e:Error) { Alert.show(&quot;XXX&quot;); } CommonControl.getInstance().getLoginUser(loginUserId,callback); function callback(roles:ArrayCollection):void { if(roles != null) { if(roles.length&gt;1) { tenantCombo.visible = true; } tenantCombo.dataProvider = roles; tenantCombo.labelField = &quot;tenantUID&quot;; loginUser = roles[0]; buttonBar.tabArr = loginUser.authorityList; loadModule(&quot;MonitorModule.swf&quot;,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[&quot;getModuleName&quot;] as Function).call(); if(moduleName == &quot;ManagementModule&quot;) { management = module; } if(moduleName == &quot;MonitorModule&quot;) { monitor = module; } if(moduleName == &quot;ReportModule&quot;) { report = module; } if(moduleName == &quot;BlueOfficeMapModule&quot;) { blueOffice = module; } if(moduleName == &quot;TenantModule&quot;) { tenant = module; } if(moduleName != &quot;BlueOfficeMapModule&quot;) { moduleContainter.addChild(module as LayoutContainer); } else { showEOfficeWindow(blueOffice); } (module[&quot;init&quot;] 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 = &quot;E-Office&quot;; titleWindow.showCloseButton = true; titleWindow.width = 800; titleWindow.height = Application.application.height*0.8; titleWindow.verticalScrollPolicy = &quot;off&quot;; titleWindow.horizontalScrollPolicy = &quot;off&quot;; 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[&quot;groupTabName&quot;] as String; switch (tabName) { case &quot;Printer Management&quot;: if(management == null) { loadModule(&quot;ManagementModule.swf&quot;,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 &quot;Monitoring&quot;: if(monitor == null) { loadModule(&quot;MonitorModule.swf&quot;,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 &quot;Reporting&quot;: if(report == null) { loadModule(&quot;ReportModule.swf&quot;,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 &quot;Tenant Management&quot;: if(tenant == null) { loadModule(&quot;TenantModule.swf&quot;,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[&quot;path&quot;] = &quot;assets/maps/sh-3f-map.swf&quot;; //initParams[&quot;location&quot;] = &quot;3g-1&quot;; var locationParams:Object = DPSUtil.location2EOfficeMapPath(location); if(locationParams != null) { if(blueOffice!=null) { showEOfficeWindow(blueOffice); (blueOffice[&quot;init&quot;] as Function).call(null,locationParams); } else { loadModule(&quot;BlueOfficeMapModule.swf&quot;,locationParams); } } else { Alert.show(&quot;E-Office does not support this building&quot;); } } 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(&quot;MonitorModule.swf&quot;,loginUser); progressBar.visible = false; } ]]--&gt; &lt;/mx:Script&gt; &lt;mx:Canvas width=&quot;100%&quot;&gt; &lt;common:GroupButtonBarView id=&quot;buttonBar&quot; width=&quot;100%&quot;&gt;&lt;/common:GroupButtonBarView&gt; &lt;mx:HBox width=&quot;100%&quot; horizontalAlign=&quot;right&quot;&gt; &lt;mx:ComboBox id=&quot;tenantCombo&quot; change=&quot;tenantChange(event)&quot; visible=&quot;false&quot;/&gt; &lt;mx:Button label=&quot;Add Tenant&quot; click=&quot;addTenantClick()&quot;/&gt; &lt;/mx:HBox&gt; &lt;/mx:Canvas&gt; &lt;mx:VBox id=&quot;moduleContainter&quot; width=&quot;100%&quot; height=&quot;100%&quot;&gt; &lt;/mx:VBox&gt; &lt;mx:ProgressBar id=&quot;progressBar&quot; source=&quot;{info}&quot; horizontalCenter=&quot;0&quot; verticalCenter=&quot;0&quot; color=&quot;0x333333&quot; fontWeight=&quot;normal&quot;/&gt; &lt;/mx:Application&gt; </textarea>

GroupButtonBarView中

<textarea cols="50" rows="15" name="code" class="c-sharp">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;mx:VBox xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot; verticalGap=&quot;0&quot; verticalAlign=&quot;middle&quot;&gt; &lt;!--&lt;mx:Script source=&quot;../../../asset/Image.as&quot;/&gt;--&gt; &lt;mx:Script&gt; &lt;!--[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(&quot;groupTabChange&quot;); dyEvent.groupTabName = evt.label; dispatchEvent(dyEvent); } public function set tabArr(tabs:ArrayCollection):void { groupNameArray4Admin = tabs; } //[Bindable]public var groupNameArray4Admin:Array = [&quot;Monitoring&quot;]; [Bindable] public var groupNameArray4Admin:ArrayCollection = new ArrayCollection( [ { authorityName: &quot;Monitoring&quot;, responseTime: 100}]); [Bindable] public var groupNameArray4Admin1:ArrayCollection = new ArrayCollection( [ { authorityName: &quot;Monitoring&quot;, responseTime: 100}]); ]]--&gt; &lt;/mx:Script&gt; &lt;mx:Metadata&gt; [Event(name=&quot;groupTabChange&quot;,type=&quot;flash.events.DynamicEvent&quot;,bubbles=&quot;true&quot;,cancelable=&quot;true&quot;)] &lt;/mx:Metadata&gt; &lt;!--linkButtonStyleName=&quot;blueTabButton&quot;--&gt; &lt;mx:HBox width=&quot;100%&quot;&gt; &lt;mx:LinkBar id=&quot;linkBar&quot; linkButtonStyleName=&quot;blueTabButton&quot; selectedIndex=&quot;{linkBarSelectedIndex}&quot; itemClick=&quot;linkBarItemClickHandler(event)&quot; dataProvider=&quot;{groupNameArray4Admin}&quot; labelField=&quot;authorityName&quot; separatorWidth=&quot;0&quot; paddingTop=&quot;0&quot; paddingBottom=&quot;0&quot; /&gt; &lt;mx:Spacer width=&quot;100%&quot;/&gt; &lt;!--&lt;mx:ComboBox dataProvider=&quot;&quot;&gt;&lt;/mx:ComboBox&gt;--&gt; &lt;/mx:HBox&gt; &lt;mx:HRule id=&quot;blueHRule&quot; width=&quot;100%&quot; strokeColor=&quot;#61b3f5&quot; shadowColor=&quot;#61b3f5&quot;/&gt; &lt;/mx:VBox&gt;&nbsp;</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">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;mx:Module xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot; implements=&quot;module.IModuleInterface&quot; layout=&quot;vertical&quot; width=&quot;100%&quot; height=&quot;100%&quot; xmlns:monitor=&quot;dps.component.monitor.*&quot;&gt; &lt;mx:Script&gt; &lt;!--[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(&quot;show Printer Monitor&quot;+&quot;:&quot;+args) } public function getModuleName():String { return &quot;MonitorModule&quot;; } 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(&quot;connect successfully&quot;); } private function dataHandler(event:ProgressEvent):void { } ]]--&gt; &lt;/mx:Script&gt; &lt;monitor:MonitorView id=&quot;monitorView&quot; width=&quot;100%&quot; height=&quot;100%&quot;&gt; &lt;/monitor:MonitorView&gt; &lt;/mx:Module&gt; </textarea>

 

 

 

 

 

 

 

 

 

 

ps:谢谢郑老大的无私教导和http://flex-java-oracle.javaeye.com/blog/543139的作者,部分内容分引自二者


你可能感兴趣的:(String,function,object,Module,report,null)