Flex Builder中创建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代码?
? ? ? ? ? 这项技术同时也应用到组件中,当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.javaeye.com/blog/192337 ? http://bufanliu.javaeye.com/blog/200594 ? ? ? ? ? ? ? ModuleLoader ? Flex中的ModuleLoader组件为模块的载入提供和很方便的接口,它是高层的处理Module的API。 ? 可以这种在flex中简单的使用module ? ?
Java代码?
? ? ? ? ? 也可以在编程时动态的改变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代码?
? ? ? ? ? ? ? ????? 在调用create()方法的时候,可以先不加入显示列表,这样就可以先将module载入内存,需要的时候再加入显示列表。 ? ? ? ? ? ???? 加载过程的事件 ? ???? 这个倒不是ModuleManager特有的,ModuleLoader也有,就是setup,ready,unload,progress,error等事件。 ? ???????? Progress事件 ? ? ? ?
Java代码?
? ? ?? 主要就是bytesLoaded和bytesTotal,分别表示已经加载的字节数和总共的字节数。 ? ? ? ? ? ? 模块与应用之间的访问 ? ? ? ?
? ? ? ? ????? Application访问模块 ????? 用ModuleLoader载入的模块,application可以用child来访问module中的方法。比如在模块中有一个公共的objectMethod方法
Java代码?
? 如果使用ModuleManager,那么可以向下面这样:
Java代码?
? ? ???? 模块访问Application ????? 主要是使用parentApplication?属性:
Java代码?
? ? 模块访问模块 ????? 有两个模块,可以通过Application来访问: ?
Java代码?
? ? ??? 给ModuleLoader传递参数 ? ???? 采用给url传递参数的方式,下面的是载入module的url ? ??????
Java代码?
? ? ??????在模块中 ? ?
Java代码?
? ? ? 利用接口避免耦合 ? ????? 我们可以定义一个ActionScript接口,Module模块对象实现了这个接口中定义的方法和属性,那么主应用Application就可以访问这个接口中定义的属性和方法。接口中定义了Module模块对象和主应用Application需要共享的数据和方法,是两者间共同的一个契约,同时也实现了接口和实现的分离,达到了松耦合的目的。 接口
Java代码?
? ? 模块文件IModuleInterface
Java代码?
? ? ?? ?Application中 ?
Java代码?
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |