加载和卸载模块
你可用来在你的Flex程序中加载和卸载模块的技巧包括使用ModuleLoader和ModuleManager。
 
使用ModuleLoader类加载模块
你可以使用ModuleLoader类在程序或其他模块中加载模块。在MXML中最简单的方式是通过使用<mx:ModuleLoader>标签。你设定url属性值来指出模块的SWF文件的位置。下面的例子在应用程序第一次启动时加载模块:
<!-- modules/MySimplestModuleLoader.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:ModuleLoader url="ColumnChartModule.swf"/>
</mx:Application>
你可以通过在其他时间,比如在一个事件的响应中设置url属性的值,来改变模块加载的时机。
 
为一个ModuleLoader设置目标URL将调用loadModule()方法。这个动作在你第一次通过设定url属性的方式创建一个ModuleLoader时发生,也会在你改变url属性的值的时候发生。
 
如果你将url属性的值设定为一个空字符串(""),ModuleLoader将卸载当前的模块。在一个程序中,你可以有多个ModuleLoader类的实例。下面的例子在用户将TabNavigator容器导航到恰当的卡片时加载模块:
 
<?xml version="1.0"?>
<!-- modules/URLModuleLoaderApp.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
        <mx:Panel
                title="Module Example"
                height="90%"
                width="90%"
                paddingTop="10"
                paddingLeft="10"
                paddingRight="10"
                paddingBottom="10"
        >
        
                <mx:Label width="100%" color="blue"
                        text="Select the tabs to change the panel."/>
            
                <mx:TabNavigator id="tn"
                        width="100%"
                        height="100%"
                        creationPolicy="auto"
                >
                
                        <mx:VBox id="vb1" label="Column Chart Module">
                                <mx:Label id="l1" text="ColumnChartModule.swf"/>
                             <mx:ModuleLoader url="ColumnChartModule.swf"/>
                        </mx:VBox>
                        
                        <mx:VBox id="vb2" label="Bar Chart Module">
                                <mx:Label id="l2" text="BarChartModule.swf"/>
                                <mx:ModuleLoader url="BarChartModule.swf"/>
                        </mx:VBox>
            
                </mx:TabNavigator>        
                
        </mx:Panel>
</mx:Application>
 
你也可以使用ModuleLoaderAPI的loadModule()和unloadModule()方法来加载和卸载模块。这些方法不需要参数,ModuleLoader加载和卸载匹配当前url属性值的模块。
 
下面的在你点击按钮时加载和卸载模块:
<?xml version="1.0"?>
<!-- modules/ASModuleLoaderApp.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
        <mx:Script>
        <![CDATA[
                import mx.modules.*;
                public function createModule(m:ModuleLoader, s:String):void {
                  if (!m.url) {
                    m.url = s;
                    return;
                  }
                 m.loadModule();
                }
                
                public function removeModule(m:ModuleLoader):void {
                  m.unloadModule();
                }
        ]]>
        </mx:Script>
        <mx:Panel title="Module Example"
                height="90%"
                width="90%"
                paddingTop="10"
                paddingLeft="10"
                paddingRight="10"
                paddingBottom="10"
        >

                <mx:TabNavigator id="tn"
                        width="100%"
                        height="100%"
                        creationPolicy="auto"
                >

                        <mx:VBox id="vb1" label="Column Chart Module">
                                <mx:Button
                                        label="Load"
                                        click="createModule(chartModuleLoader, l1.text)"
                                />
                                
                                <mx:Button
                                        label="Unload"
                                        click="removeModule(chartModuleLoader)"
                                />
                                
                                <mx:Label id="l1" text="ColumnChartModule.swf"/>
                                
                                <mx:ModuleLoader id="chartModuleLoader"/>
                        </mx:VBox>
                        
                        <mx:VBox id="vb2" label="Form Module">
                                <mx:Button
                                        label="Load"
                                        click="createModule(formModuleLoader, l2.text)"
                                />
                                
                                <mx:Button
                                        label="Unload"
                                        click="removeModule(formModuleLoader)"
                                />
                                
                                <mx:Label id="l2" text="FormModule.swf"/>
                                
                                <mx:ModuleLoader id="formModuleLoader"/>
                        </mx:VBox>
    </mx:TabNavigator>
  </mx:Panel>
</mx:Application>
当你加载一个模块时,不管为模块调用多少次load()方法,Flex确保只有一个被加载的模块的拷贝。
 
当两个同名但实现不同的模块被加载时,第一个被加载的模块将被使用。这将导致运行时错误。这种情况通常在模块的拥有者定义了多个模块时发生。因为这些模块处于平行的程序域中,加载类定义的模块将首先使用那个类,而其他模块尝试使用那个类时将遭遇异常。解决方案是将类定义提升到主应用程序域中,这样所有的模块都可以使用那个类。