技术开发 频道

创建模块化应用程序

    第一个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事件。

0
相关文章