创建模块化程序(三)

加载和卸载模块
你可用来在你的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确保只有一个被加载的模块的拷贝。
 
当两个同名但实现不同的模块被加载时,第一个被加载的模块将被使用。这将导致运行时错误。这种情况通常在模块的拥有者定义了多个模块时发生。因为这些模块处于平行的程序域中,加载类定义的模块将首先使用那个类,而其他模块尝试使用那个类时将遭遇异常。解决方案是将类定义提升到主应用程序域中,这样所有的模块都可以使用那个类。

你可能感兴趣的:(职场,休闲,介绍模块化Flex程序)