`

Flex中的模块

    博客分类:
  • flex
 
阅读更多

Module

 

 

Module加 载是Adobe解决Flex系统应用初始化时较大的下载负载而设计的一种折中方案。Module是为自己项目准备的,如果你的项目编译后大小是 1.5MB,那么也许在你使用module把项目合理分割以后大小会是 700K + 200K+ 100K+200K+ 200K+200K。为什么后 面的模块体积会变小,就是因为公有的类引用没有重复编译到他们之中了。 所以Module是为同一个项目准备的,他们之间有很强的依赖关系,并不是为其他 项目提供 "包" 。

 

 

Module 实 际上是一个预编译的SWF文件。虽然是SWF格式的文件,但是这个文件不能独立运行,并且只能被ModuleLoader加载后才能显示。逻辑上它是一个 容器,可以像一般的容器一样包含别的容器,组件,甚至是别的Module模块。根据需要,预编译的Module模块可以被应用加载和卸载。

 

 

 

Flex Builder中创建Module

 

 

 

      可以使用 <mx:Module> 创建Module类;令一种方式采用ModuleManager类在ActionScript中创建Module模块类。在Flex Builder创建Module非常方便,如下图:

 

 



      
      
    

      在编译的时候就会生成一个和mxml文件同名的swf文件。

 

 

    

 

 

 

     AS中创建Module

 

 

 

 

     如果您编写仅 ActionScript 模块,则可以扩展mx.modules.ModuleBase类。如果 是MXML 文件中 的 <mx:Module> 标签编写基于 MXML 的模块,就应该扩展 mx.modules.Module类,它会将其加入到可视化显 示列表。

 

 

 

 

 

 

 

Module

 

 

 

通 常将模块载入一个子域,那么模块里面的类定义都不是application域的。比如第一个模块载入了类PopUpManager,那么整合 Application中,它就成了PopUpManager的拥有者,因为像这种manager都是单例的,如果另外一个模块稍后要使用这个 PopUpManager,就会引发运行时异常。

 

解决办法就是确保这些managers,比如PopUpManager and DragManager或者其他一些共享的服务 是在application中定义的,这样就能确保所有模块都能够使用。在main Application中:

 

 

 

 

Java代码 复制代码  收藏代码
  1. import  mx.managers.PopUpManager;   
  2.   
  3. import  mx.managers.DragManager;   
  4.   
  5. private  var popUpManager:PopUpManager;   
  6.   
  7. private  var dragManager:DragManager;  
import mx.managers.PopUpManager;

import mx.managers.DragManager;

private var popUpManager:PopUpManager;

private var dragManager:DragManager;

 

 

 

 

 

 

 

这 项技术同时也应用到组件中,当module第一次使用组件时,将在它自己的域中拥有这些组件的类定义。如果别的module试图使用这些已经被另一个 module使用的组件,它的定义将会不能匹配到现存的定义中。因此,为了避免组件的定义不匹配,在主应用程序中创建组件的实例,让所有的module去 引用。

 

 

但是这个坏处很明显,这些声明莫名其妙,成为了一个"木偶变量",所以在网上找到另一种办法,参见

 

http://www.blogjava.net/alex0927/archive/2008/11/24/241989.html?opt=admin

 

 

在ModuleLoader 的creationComplete方法中加入如下代码, 表示将其加载到运行时库

moduleLoader.applicationDomain = ApplicationDomain.currentDomain;

对于使用ModuleManager,可以在IModuleInfo的load方法里面指定域。

 

 

有关于应用程序域内容存可以参考下面几篇文章:

 

 

http://hereson.iteye.com/blog/192337

 

 

http://bufanliu.iteye.com/blog/200594

 

 

 

 

 

 

 

 

 

ModuleLoader

 

 

 

Flex中的ModuleLoader组件为模块的载入提供和很方便的接口,它是高层的处理Module的API。

 

 

可以这种在flex中简单的使用module

 

 

 

 

Java代码 复制代码  收藏代码
  1. <mx:ModuleLoader url= "MXMLDemoModule.swf" />  
<mx:ModuleLoader url="MXMLDemoModule.swf"/>

 

 

 

 

 

 

 

也可以在编程时动态的改变URL,来加载不同的Module。

 

 

ModuleLoader其实是一种特殊的导航式容器。和一般导航式容器如ViewStack不同的是,ModuleLoader不必在初始化时携带加载所有的孩子组件。

 

 

另外,推荐在moduleloader做切换的时候,加上: moduleLoader.unloadModule再做moduleLoader.loadModule()。Flex确保调用load()方法只有一个对象。

 

 

 

 

 

 

 

ModuleManager

 

 

 

ModuleManager类提供了低层次的处理Module的装载卸载以及事件响应等的变成接口。这种方式比起纯粹的ModuleLoader方式稍微复杂一点,但是ModuleManager提供了比ModuleLoader更加强大的能力来管理Module模块的加载过程。

 

 

       具体操作可以分成以下几步:

 

 

1.通过ModuleManager实例的getModule()方法拿到Module模块的一个索引,索引类型为IModuleInfo。 

 

 

2.调用这个索引的load()方法。 

 

 

3.利用这个接口的factory属性拿到它相关连的Module工厂,调用此工厂的create()方法,并将返回值强制转换成当前的Module类型。

 

 

    

     看以下代码:

 

 

 

 

 

 

 

Java代码 复制代码  收藏代码
  1.                   private  var module:IModuleInfo;   
  2.   
  3. module = ModuleManager.getModule( "UserList.swf" );   
  4.   
  5. module.addEventListener(   
  6. ModuleEvent.READY,onModuleReadyUseModuleManager);   
  7.   
  8. module.load();   
  9.   
  10. private  function onModuleReadyUseModuleManager(event:Event): void {   
  11.   
  12.     var me:ModuleEvent = event as ModuleEvent;     
  13.     userList = me.module.factory.create() as UserList;         
  14.     container.addChild(userList);   
  15.                
  16. }  
                  private var module:IModuleInfo;

	module = ModuleManager.getModule("UserList.swf");
	
	module.addEventListener(
	ModuleEvent.READY,onModuleReadyUseModuleManager);
	
	module.load();

	private function onModuleReadyUseModuleManager(event:Event):void{

		var me:ModuleEvent = event as ModuleEvent;	
		userList = me.module.factory.create() as UserList;		
		container.addChild(userList);
				
	}

 

 

 

 

 

 

 

 

 

      在调用create()方法的时候,可以先不加入显示列表,这样就可以先将module载入内存,需要的时候再加入显示列表。

 

 

 

 

 

 

 

     加载过程的事件

 

 

     这个倒不是ModuleManager特有的, ModuleLoader 也有,就是setup,ready,unload, progress,error等事件。

 

 

         P rogress事件

 

 

 

 

 

Java代码 复制代码  收藏代码
  1. protected  function onModuleProgress (e:ModuleEvent) :  void  {   
  2.   
  3.     trace ( "ModuleEvent.PROGRESS received: "  + e.bytesLoaded +  " of "  + e.bytesTotal +  " loaded." );   
  4.        
  5.        }  
protected function onModuleProgress (e:ModuleEvent) : void {

	trace ("ModuleEvent.PROGRESS received: " + e.bytesLoaded + " of " + e.bytesTotal + " loaded.");
	
       }


 

 

 

 

   主要就是 bytesLoaded bytesTotal ,分别表示已经加载的字节数和总共的字节数。

 

 

 

 

 

 

 

 

模块与应用之间的访问

 

 

 

 

 

 


           

 

 

 

 

 

      Application访问模块

 

 

      用ModuleLoader载入的模块,application可以用child来访问module中的方法。比如在模块中有一个公共的objectMethod方法

 

 

 

Java代码 复制代码  收藏代码
  1. s = (m1.child as loaderModule).objectMethod();  
s = (m1.child as loaderModule).objectMethod();

 

 

 

 

 

如果使用 ModuleManager ,那么可以向下面这样:

 

 

 

Java代码 复制代码  收藏代码
  1. public  var sm:Object=moduleInfo.factory.create() as loaderModule;   
  2.   
  3. s = sm. objectMethod;  
public var sm:Object=moduleInfo.factory.create() as loaderModule;

s = sm. objectMethod;


 

 

 

 

 

     模块访问Application

 

 

      主要是使用 parentApplication  属性:

 

 

 

 

 

Java代码 复制代码  收藏代码
  1. // testProperty可以是application的一个属性或者方法,当然module的可移植性几乎就没有了   
  2.   
  3. var aa:Object= this .parentApplication.testProperty;  
// testProperty可以是application的一个属性或者方法,当然module的可移植性几乎就没有了

var aa:Object=this.parentApplication.testProperty;

 

 

 

 

模块访问模块

 

 

      有两个模块,可以通过Application来访问:

 

 

 

 

Java代码 复制代码  收藏代码
  1. <mx:ModuleLoader url= "InterModule1.swf"  id= "m1" />   
  2.   
  3. <mx:ModuleLoader url= "InterModule2.swf"  id= "m2" />   
  4.   
  5.   
  6. s = parentApplication.m1.child. objectMethod ();  
<mx:ModuleLoader url="InterModule1.swf" id="m1"/>

<mx:ModuleLoader url="InterModule2.swf" id="m2"/>


s = parentApplication.m1.child. objectMethod ();



 

 

    给ModuleLoader传递参数

 

 

 

     采用给url传递参数的方式,下面的是载入module的url

 

      

Java代码 复制代码  收藏代码
  1. var s:String =  "QueryStringModule.swf?"  +  "firstName="  +ti1.text +  "&lastName="  + ti2.text;  
var s:String = "QueryStringModule.swf?" + "firstName=" +ti1.text + "&lastName=" + ti2.text;

 

 

      在模块中

 

 

 

Java代码 复制代码  收藏代码
  1.       var myPattern:RegExp = /.*\?/;   
  2.       var s:String =  this .loaderInfo.url.toString();   
  3.       s = s.replace(myPattern,  "" );   
  4.   
  5.       var params:Array = s.split( "&" );   
  6.       var keyStr:String;   
  7.       var valueStr:String;   
  8.       var paramObj:Object = params;   
  9.            
  10.     for  (keyStr in paramObj) {   
  11. valueStr = String(paramObj[keyStr]);   
  12. ta1.text += keyStr +  ":"  + valueStr +  "\n" ;   
  13.     }   
  14.            
  15.      for  (var i: int  =  0 ; i < params.length; i++) {   
  16. var tempA:Array = params[i].split( "=" );   
  17. if  (tempA[ 0 ] ==  "firstName" ) {   
  18.       o.firstName = tempA[ 1 ];   
  19. }   
  20. if  (tempA[ 0 ] ==  "lastName" ) {   
  21.        o.lastName = tempA[ 1 ];   
  22. }   
  23.       }   
  24.   
  25.        if  (StringUtil.trim(o.firstName) !=  ""  &&  StringUtil.trim(o.lastName) !=  "" ) {   
  26. salutation =  "Welcome "  +o.firstName +  " "  + o.lastName +  "!" ;   
  27.       }  else  {   
  28. salutation =  "Full name not entered."   
  29.       }  
       var myPattern:RegExp = /.*\?/;
       var s:String = this.loaderInfo.url.toString();
       s = s.replace(myPattern, "");
	
       var params:Array = s.split("&");
       var keyStr:String;
       var valueStr:String;
       var paramObj:Object = params;
			
    for (keyStr in paramObj) {
	valueStr = String(paramObj[keyStr]);
	ta1.text += keyStr + ":" + valueStr + "\n";
     }
			
     for (var i:int = 0; i < params.length; i++) {
	var tempA:Array = params[i].split("=");
	if (tempA[0] == "firstName") {
	      o.firstName = tempA[1];
	}
	if (tempA[0] == "lastName") {
	       o.lastName = tempA[1];
	}
       }

       if (StringUtil.trim(o.firstName) != "" &&  StringUtil.trim(o.lastName) != "") {
	salutation = "Welcome " +o.firstName + " " + o.lastName + "!";
       } else {
	salutation = "Full name not entered."
       }


 

 

 

 

利用接口避免耦合

 

 

 

      我们可以定义一个ActionScript接口,Module模块对象实现了这个接口中定义的方法和属性,那么主应用Application就可以访问这 个接口中定义的属性和方法。接口中定义了Module模块对象和主应用Application需要共享的数据和方法,是两者间共同的一个契约,同时也实现 了接口和实现的分离,达到了松耦合的目的。

 

 

接口

 

 

 

Java代码 复制代码  收藏代码
  1. package {   
  2.   
  3.   
  4. import  flash.events.IEventDispatcher;   
  5.   
  6.   
  7.      public   interface  IModuleInterface  extends  IEventDispatcher {   
  8.   
  9.          function getModuleName():String;   
  10.   
  11.          function setAdjusterID(s:String): void ;   
  12.   
  13.          function setBackgroundColor(n:Number): void ;   
  14.   
  15.    }   
  16.   
  17.   
  18. }  
package{


import flash.events.IEventDispatcher;


    public interface IModuleInterface extends IEventDispatcher {

         function getModuleName():String;

         function setAdjusterID(s:String):void;

         function setBackgroundColor(n:Number):void;

   }


}



 

 

 

 

模块文件 IModuleInterface

 

 

 

Java代码 复制代码  收藏代码
  1. <?xml version= "1.0" ?>   
  2.   
  3. <!-- modules/interfaceexample/AutoInsurance.mxml -->   
  4.   
  5. <mx:Module xmlns:mx= "http://www.adobe.com/2006/mxml"  width= "100%"   
  6.   
  7. height= "100%"   implements = "IModuleInterface" >   
  8.   
  9.   
  10. <mx:Panel id= "p1"  title= "Auto Insurance"  width= "100%"  height= "100%"  backgroundColor= "{bgcolor}" >    
  11.   
  12. <mx:Label id= "myLabel"  text= "ID: {adjuster}" />   
  13.   
  14. </mx:Panel>   
  15.   
  16.   
  17. <mx:Script>   
  18.   
  19.   
  20. <![CDATA[   
  21.   
  22. [Bindable]   
  23.   
  24. private  var adjuster:String;   
  25.   
  26. [Bindable]   
  27.   
  28. private  var bgcolor:Number;   
  29.   
  30.   
  31. public  function setAdjusterID(s:String): void  {   
  32.   
  33. adjuster = s;   
  34.   
  35. }   
  36.   
  37. public  function setBackgroundColor(n:Number): void  {   
  38.   
  39. bgcolor = n;   
  40.   
  41. }   
  42.   
  43. public  function getModuleName():String {   
  44.   
  45. return   "Auto Insurance" ;   
  46.   
  47. }   
  48.   
  49. ]]>   
  50.   
  51. </mx:Script>   
  52.   
  53. </mx:Module>  
<?xml version="1.0"?>

<!-- modules/interfaceexample/AutoInsurance.mxml -->

<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" width="100%"

height="100%" implements="IModuleInterface">


<mx:Panel id="p1" title="Auto Insurance" width="100%" height="100%" backgroundColor="{bgcolor}"> 

<mx:Label id="myLabel" text="ID: {adjuster}"/>

</mx:Panel>


<mx:Script>


<![CDATA[

[Bindable]

private var adjuster:String;

[Bindable]

private var bgcolor:Number;


public function setAdjusterID(s:String):void {

adjuster = s;

}

public function setBackgroundColor(n:Number):void {

bgcolor = n;

}

public function getModuleName():String {

return "Auto Insurance";

}

]]>

</mx:Script>

</mx:Module>


 

 

 

 

 

 

 

 

 

    Application

 

 

 

Java代码 复制代码  收藏代码
  1. var ichild:* = mod.child as IModuleInterface;   
  2.   
  3.   
  4. if  (mod.child !=  null ) {   
  5.   
  6.   
  7.     ichild.setAdjusterID(myId.text);   
  8.   
  9.    ichild.setBackgroundColor(myColor.selectedColor);   
  10.   
  11.   

 

欢迎访问Java学习者论坛:http://www.javaxxz.com

分享到:
评论

相关推荐

    eclipse项目中同时开发j2ee模块和flex客户端模块

    要在同一个Eclipse项目中同时开发J2EE和Flex模块,首先需要确保Eclipse已经配置了J2EE和Flex的开发环境。这可能包括安装Java EE和ADT插件,以及配置相应的服务器(如Tomcat、Glassfish等)和Flash Builder。 5. **...

    Flex之模块化

    3. **Flex模块的创建**: 在Flex中,可以通过MXML或ActionScript创建模块。通常,一个模块会包含一个主MXML文件,它是模块的入口点,定义了模块的界面和行为。在MXML文件中,可以声明组件、绑定数据和添加事件处理...

    FLEX4025十六通道热电阻温度采集模块用户手册-V1.0.pdf

    FLEX-4015热电阻采集模块是FLEX-4000系列智能测控模块之一,广泛应用于温度/电阻测量的工业场合,提供了热电阻/电阻信号的采集以及转换,线性处理并转换成线性化的数据值,经RS-485 总线传送到控制器。FLEX-4015具有...

    AB罗克韦尔FLEX-5000-IO模块.pdf

    AB罗克韦尔FLEX-5000-IO...通过这些详细知识点的介绍,可以看出AB罗克韦尔FLEX-5000-IO模块在工业自动化领域中所能提供的强大功能和高可靠性。它不仅是自动化工程师的好帮手,也是现代制造系统中不可或缺的组成部分。

    Flex模块化开发实例

    通过将应用程序的不同部分封装到单独的模块中,我们可以按需加载和卸载它们,从而减少启动时间和内存占用。 2. **模块的优点**: - **代码组织**:模块有助于保持代码结构清晰,使开发者更容易理解和维护。 - **...

    关于FlexCAN的芯片资料

    在FlexCAN模块中,还包含了一些新的特征,如远程请求帧的自动或软件处理,正常模式下ID过滤配置的安全机制,以及在“Freeze”模式下进行的CAN比特时间设置与配置比特等。这些新特征进一步增强了FlexCAN模块的性能和...

    Flex Module间通信

    例如,一个模块可以通过`.dispatchEvent()`方法发布事件,并在其他模块中使用`addEventListener()`方法监听该事件,从而触发相应的处理函数。 2. **公共接口和单例模式**:创建一个公共接口或单例类,模块可以通过...

    flex 模块化modules源码例子

    2. **Flex模块化机制**:在Flex中,模块(Module)是可以通过`mx:Module`标签定义的独立的SWF文件。它们在运行时按需加载,有助于减少初始加载时间,并且可以动态地添加或移除模块。使用模块可以优化性能,因为不是...

    在eclipse 的一个项目中同时开发j2ee模块和flex 客户端模块.doc

    在本文档中,我们将探讨如何在Eclipse环境中同时开发J2EE模块和Flex客户端模块,以实现一个完整的、集成了Flex界面和后端Java服务的应用。这个过程涉及到Eclipse Web Tools Platform (WTP)插件、Flex Builder Plugin...

    FlexCAN详解

    FlexCAN(Flexible Controller Area Network)模块是一种实现了CAN(Controller Area Network)协议的通信控制器,即遵循CAN 2.0B协议规范。FlexCAN广泛应用于需要实时处理、可靠通信和成本效益的汽车串口总线系统中...

    flex 模块化 modules文档

    创建Flex模块涉及到几个关键步骤: 1. **定义模块**:首先需要定义一个模块,通常这涉及创建一个新的Flex项目,并指定其为主模块或普通模块。 2. **实现`IFlexModuleFactory`接口**:每个模块都必须包含一个实现了`...

    Flex 模块化应用程序开发

    模块化设计在软件工程领域有着重要的意义,尤其是在像Flex这样的框架中。Flex是一款由Adobe公司开发的开源框架,用于构建高性能、具有丰富交互性的Web应用程序。通过采用模块化的开发方式,开发者可以将大型的应用...

    IBM Flex System配置以太网络模块图解

    IBM Flex System是IBM公司推出的模块化计算解决方案,它将服务器、存储和网络组件集成在一个灵活的架构中,以支持各种工作负载和数据中心环境。其中,以太网络模块是该架构中的重要组成部分,负责实现计算节点与网络...

    在eclipse_的一个项目中同时开发j2ee模块和flex_客户端模块

    在本文中,我们将探讨如何在Eclipse环境中同时开发J2EE模块和Flex客户端模块,以实现高效的前后端协同开发。Eclipse是一个强大的集成开发环境(IDE),它通过Web Tools Platform (WTP)插件提供了对J2EE Web应用程序...

    基于S32KDS平台SDK3.0编写的flexcan组件can fd测试例程

    FlexCAN是S32K微控制器中的一个关键通信模块,它支持经典CAN(Controller Area Network)和更先进的CAN FD协议。CAN FD能够提供更高的数据传输速率,最大可达到5 Mbps,相比经典CAN的1 Mbps有显著提升,这在需要快速...

    FLEX 中文 教程

    在本教程中,我们将深入探讨Flex的相关概念、开发环境的搭建以及如何利用Flex创建功能丰富的交互式Web应用。 一、Flex简介 Flex是由Adobe公司推出的,主要目标是提供一个强大的开发工具集,使开发者可以使用MXML和...

Global site tag (gtag.js) - Google Analytics