flex Module

Modules技术
       flex的Modules技术是可以被flex程序使用的一个swf文件,它不能脱离程序独立运行,但是多个程序之间可以共享它。flex的 Modules技术将应用程序分割成小块、模块,主程序动态的加载所需要的模块。主程序在启动时并不全部加载所有的模块。当用户和模块没有交互的时候它不 需要加载模块,同时它在模块不需要的时候可以卸载模块并释放内存和资源。Module和RSLs(运行时共享库)很相似,他们独立分离代码将应用程序分成 独立的加载的swf文件。但它比RSLs更加灵活,因为它可以在运行时动态加载/卸载并且不依赖于应用程序编译。
       Module是一个特殊的可以动态加载的包含IFlexModuleFactory类工厂的swf文件。它允许应用程序在运行时加载代码并在不需要主程序 相关连类实现的情况下创建类的实例。Module组件是继承于LayoutContainer,其实是一个flex容器,如果您的模块不包含任何flex 框架代码,则可以创建扩展 ModuleBase 类的类。与创建基于 Module 类的模块相比,如果您使用 ModuleBase 类,则通常情况下您的模块要小一些,因为它没有任何flex框架类依赖项。
       ModuleManager 负责管理加载了的modules集合,将之对待为按照module URL为索引的单例map。加载module会触发一系列的事件来让客户端监控module的状态。module只加载一次,但是会重载并分发事件,因此 客户端代码可以简单的依赖 READY 事件来获取module的类工厂来使用它。
        ModuleLoader 组件的行为方式与 SWFLoader 极为相似,不同的是它需要遵循与加载内容间的合同要求。本合同规定子级 SWF 文件实现 IFlexModuleFactory,并且可以按需使用实现的 factory 创建子类的多个实例。
 
Modules的优点:
    让swf文件初始下载尺寸更小
   让加载时间更短
    对应用程序更好的封装性。
 
应用Module步骤:
1 创建任意数量的modules。基于MXML文件的根节点是<mx:Module>。基于AS的扩展Module或者ModuleBase类。
2 编译module,方式如同应用程序的编译。可以使用基于命令行的mxmlc或者集成于flexbuilder中的编译器。
3 创建一个应用程序类。
4 在应用程序文件中使用<mx:ModuleLoader>来加载modules。或者你也可以使用mx.modules.ModuleLoader和mx.modules.ModuleManager类的方法来加载。

Module的加载
方法1:     
<mx:ModuleLoader url="ModuleA.swf"/>
方法2:
public var info:IModuleInfo;     
private function initApp():void {
  info = ModuleManager.getModule("ModuleA.swf");
  info.addEventListener(ModuleEvent.READY, modEventHandler);          
  info.load();
}    
private function modEventHandler(e:ModuleEvent):void
    var moduleA:ModuleA = info.factory.create() as ModuleA;
}
 默 认下,一个module会被加载进当前应用程序domain的子domain。你可以通过使用ModuleLoader的 applicationDomain的属性来指定不同的应用程序domain。 因为module被加载到子domain中,因此它拥有的类将不属于主应用程序的domain中。举例:当一个module加载了 PopUpManager类,那么在整个应用程序中它就变成了PopUpManager类的Owner,因为它注册到SingletonManager 中。加入另外一个module晚些试图使用PopUpManager,
Adobe ® Flash® Player 将会抛错。解决方法是确保如PopUpManager、DragManager这些managers和一些共享服务都定义在主应用程序中(或者晚加载入应 用程序domain中)。这样这些类可以被所有的module使用。典型的,都是通过将他们添加到脚本块中:   import mx.managers.PopUpManager;  private var popUpManager:PopUpManager; 
这项技术同时也应用到components,当module第一次使用component时,将在它自己的domain中拥有这 component的类定义。作为结果,如果别的module试图使用这些已经被另一个module使用的component,它的定义将会不能匹配到现 存的定义中。因此,为了避免component的定义不匹配,在主应用程序中创建component的实例,让所有的module去引用。
        当你第一次开启应用程序来使用module,此应用程序将会比不使用module的应用程序尺寸更小。同时它也会减小等待时 间。但同时,它将会在你访问以前非module的地方增加延迟。这是因为它不是预加载的。他们在第一次请求的时候被加载。 当module第一次被加载时,module的swf文件通过网络传输并储存到浏览器的缓存中。当它被卸载后又被加载时,等待时间会稍短,这是因为 Flash Player将在客户端浏览器缓存中加它,而非网络。 Module的swf文件和其他所有的swf文件一样,存在于客户端缓存一直到用户清空他们。因此module可以被主应用程序跨不同的session访 问,减少加载时间,但着也依赖于浏览器的缓存清空频率。你可以预加载
module到内存即使当它目前并没有被用到的时候。使用IModuleInfo类的load方法在应用程序启动时可以预加载module。它将module加载到内存,但是并没有创建其实例。 
 
Module的安全
因为module必须和应用程序再同一个security domain中,当你在AIR应用程序中使用任何的module SWF文件时,必须和主应用在相同的目录或者在其子目录中,确保他们在相同的security沙盒中。一个确保的方法是使用URL引用module位置不 要包含“../”。在不同的服务器中加载module在不同的服务器中加载module,必须在其彼此间建立信任。跨域访问应用程序加载应用程序时必须调 用allowDomain()方法并且指定你需要加载的module所在的目标domain。因此在应用程序预初始话事件处理时指定目标域来确保程序在 module加载前启动。在module所在的远程服务的cross-domain文件,增加一个entry来指定加载应用程序的服务位置。在你自己加载 的应用程序中preinitialize事件处理器中加载远程cross-domain文件。在被加载的module调用allowDomain方法来和 调用者通讯。
 
Module 通信
1. 通过查询字串方式传入
        var url:String = "QueryStringModule.swf?firstName=" + "张三";
         loadModule(url);
在模块中可以从loderInfo中得到传入的参数:var s:String = this.loaderInfo.url.toString();
 
2. Application和Module相互访问:
    在application中可以通过 ModuleLoader的child属性得到Module实例,然后访问Module的公开方法和属性,当然也可用ModuleManager.getModule()方法。
     如果是在Module中要访问Application中方法和属性(可以是私有的),用parentApplication属性
 
3 . module和module之间
        其实是通过Application 来传递,在module中的parent是ModuleLoader,而ModuleLoader的parent就是Application了,可以在 moduleA中引用Application派发一个事件,在moduleB中引用 Application来接收事件就能传递参数了。
      也可以借助parentApplication来引用别的module, 如:在ModuleB中要访问ModuleA,
       var modelA: ModuleA = parentApplication.m1.child as ModuleA;
 

4.  通过用接口方式,即让Module实现自定义的interface。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值