22.8.使用ModuleManager载入模块

22.8.1.问题
我想具体控制模块的加载和卸载。
22.8.2.解决办法
直接访问ModuleManager类的方法来监听加载模块的各种状态事件。
22.8.3.讨论
ModuleManager 类管理着加载的模块。当调用ModuleLoader.loadModule 和ModuleLoader.unloadModule方法时<mx:ModuleLoader>组件内部就是和这个管理器进行着通信, 你可以直接访问ModuleManager 管理的模块。当模块的URL 传递给ModuleManager.getModule方法后,这个模块位置被添加到模块的管理列表中,返回一个
mx.modules.IModuleInfo类实例。

模块实际上是ModuleMananger的私有ModuleInfo类实例。ModuleInfo对象加载SWF文件,包装为实现了IModuleInfo的代理类,并通过ModuleManager.getModule方法返回实例对象。你可以监听这个代理的各种状态事件以便具体控制模块的加载。

下面的例子演示如何使用ModuleManager控制模块的显示:
+展开
-XML
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxmllayout="vertical"
creationComplete="creationHandler();">

<mx:Script>
<![CDATA[
import mx.events.ModuleEvent;
import mx.modules.ModuleManager;
import mx.modules.IModuleInfo;
private var _moduleInfo:IModuleInfo;
private function creationHandler():void {
_moduleInfo = ModuleManager.getModule( 'ContactList.swf' );
_moduleInfo.addEventListener( ModuleEvent.READY, moduleLoadHandler );
_moduleInfo.load();
}
private function moduleLoadHandler(evt:ModuleEvent ):void {
canvas.addChild( _moduleInfo.factory.create() as DisplayObject );
}

]]>
</mx:Script>
<mx:Canvas id="canvaswidth="500height="500" />
</mx:Application>

当应用程序完成布局初始化操作后,通过ModuleManager.getModule方法加载ContactList模块并返回的IModuleInfo对象。当下载模块时IModuleInfo的实现扮演着Loader实例的代理。

当模块成功下载后,使用IFlexModuleFactory.create方法添加到显示列表。这个方法返回模块的实例对象,类型被映射为DisplayObject,添加到Canvas容器的显示列表。

Y通过getModule方法返回的IModuleInfo对象,你可以监听模块的各种下载状态事件。这个例子中,应用程序直到模块完全下载后才添加到显示列表,触发的事件类型为ModuleEvent,SWF模块的下载状态有progress到error等几个状态(Table 22-1)。

Table 22-1. mx.events.ModuleEvent类


IModuleInfo 实现类的unload方法用于删除ModuleManager中的模块引用,但是不会删除显示列表中的SWF。要删除显示列表中的模块,你必须显示调用父对象的removeChild方法。

相比较之下ModuleLoader类根据url属性的更新去加载模块,而getModule方法返回的IModuleInfo实现类可以更好控制模块的加载和显示。这可以使你能预先加载模块,在与用户交互中能立即显示,缩短请求和渲染模块时间。

加支付宝好友偷能量挖...


评论(0)网络
阅读(133)喜欢(0)flash/flex/fcs/AIR