第一个Panel包含了控制示例中模块(Module)加载和卸载的RadioButtons。第二个Panel是使用<mx:ModuleLoader>标签加载模块(Module)的地方。注意那个id为currentModule的ModuleLoader,它有一个关于ready事件的事件处理器。当模块SWF文件加载了足够多可以开始使用的时候,ModuleLoader 就会分派ready事件(或者说ModuleEvent.READY)。
这里有一个readyModule函数,它在<mx:Script>块中:
程序代码
private function readyModule( event:ModuleEvent ) : void
{
var ml:ModuleLoader = event.target as ModuleLoader;
var ichild:IExpenseReport = ml.child as IExpenseReport;
if( ichild != null ) {
ichild.expenseReport = expenses;
}
}
注意ModuleLoader的child属性是如何转换为IExpenseReport类的。IExpenseReport是一个所有模块(Module)都实现了的接口。只要每个模块都实现了这个接口,它就可以很容易适应于应用程序。换句话说,想象一下当你需要创建另一个表单或者报告的时候它的用途。并不需要更改主程序为新模块添加IF语句,你只要在新模块中实现IExpenseReport接口它就可以在程序中完美地运行。
IExpenseReport接口是:
程序代码
public interface IExpenseReport
{
function set expenseReport( ac:ArrayCollection ) : void;
}
每个模块(Module)都实现这个接口,定义各自的名为expenseReport的set函数。下面是ChartModule的根标签和接口
IExpenseReport的实现:
程序代码
<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" implements="IExpenseReport"
layout="vertical"
percentWidth="100" percentHeight="100" >
<mx:Script><![CDATA[
import mx.collections.ArrayCollection;
[Bindable] public var expenses:ArrayCollection;
public function set expenseReport( ac:ArrayCollection ) : void
{
expenses = ac;
}
]]></mx:Script>
...
</mx:Module>
让我们回到主程序,RadioButton的click事件会卸载任何当前已加载的模块然后加载一个新的模块。下面是ChartModule的RadioButton标签:
程序代码
<mx:RadioButton x="10" y="123" label="Chart" click="readyModule('ChartModule.swf')"/>
这个click事件会调用上面列出的readyModule事件。