自从 flex3 开始就加入了 module 。在工程中使用 module 可以减少生成的 swf 的大小,或者可以动态添加系统的功能。使用起来非常方便,相对于使用 SwfLoader , ModuleLoader 用起来更加方便。
在使用 ModuleLoader 和 Module 时总会遇到在加载 Module 时传递参数的情况,前几天“一定搞定啥”老兄问了我这个问题,当时我给了他一个思路,就是自定义一个可以传递参数的事件,在 Module 中进行这个事件的监听,需要传递参数时使用 ModuleLoader.child.dispatchEvent(event) 这种方法来进行参数传递。当时我试了一下还是挺好用的。但是有一个前提就是 Module 必须是已经加载完成并且初始化完成之后。如果 Module 是动态加载的,需要在初始化完成之后就得到参数就比较困难了。
起初我想在 ModuleLoader 的 Ready 事件中向 child 派发事件,以为 Ready 事件触发时应该是 Module 已经加载成功之后了。遗憾的是这种方法并不好用,我想原因应该是这样:
在 Ready 事件发生时, Module 是加载成功了,但是加载成功并不意味着初始化完成,事实证明此时 Module 的 swf 还未初始化完成,用 setTimeout 函数测试发现 Ready 事件发生之后大约一秒钟之后 Module 才会响应外部派发的事件,这个时间会因为处理器的处理速度不同而不同,所以用 setTimeout 只是一个最烂的点子。
后来我有一个思路,就是在 Module 初始化成功后,告诉 ModuleLoader 我已经初始化成功了,把参数传给我吧,于是 ModuleLoader 就把参数传给 Module 。很简单的一个对话模型,不过在原有控件基础上实现就很困难,所以需要扩展一下 Module 和 Moduleloader ,把需要对话的机制加进去才可以。
其工作原理图:
首先自定义一个 Event 类,这个类里添加一个成员变量来传递参数:
然后扩展 Module ,创建一个 Module 的子类命名为 MyModule ,在这个类中声明一个事件,派发时机是 Module 的 CREATION_COMPLETE 事件发生后,目的是便于 ModuleLoader 监听这个事件,实现对话的第一步。另外在 Module 的构造函数中注册一个对 MyEvent 事件的 Listener 来监听参数传递事件。
代码如下:
最后扩展一下 ModuleLoader ,定义一个 Moduleloader 的子类 MyModuleloader 。在 Moduleloader 的 READY 事件中为 Moduleloader 的 child 注册一个 ready0 事件的监听,并且在 UNLOAD 的事件中去掉监听。添加了一个新函数 loadModuleParam ,这个函数可以带一个字符串类型的参数。
在使用时,所有的 Module 必须继承与 MyModule ,画面上的控件也要使用 MyModuleloader ,两者配合使用才可以。加载 Module 是必须使用 loadModuleParam 函数。
MyModule 的子类如果要得到参数还必须覆盖一下父类中的 myEventAction 函数:
这样就 OK 了。测试了一下还是很好用的。
这个例子使用 FlashBuilder4 完成的,使用时请注意版本。
可以到http://to9m.download.csdn.net/去下载源代码。
本文介绍如何在使用ModuleLoader加载Module时传递参数。通过自定义事件和扩展Module及ModuleLoader,实现在Module初始化完成后安全传递参数。详细介绍了自定义事件类、扩展Module以及ModuleLoader的步骤和代码示例。

158

被折叠的 条评论
为什么被折叠?



