加载module时传递参数

本文介绍如何在使用ModuleLoader加载Module时传递参数。通过自定义事件和扩展Module及ModuleLoader,实现在Module初始化完成后安全传递参数。详细介绍了自定义事件类、扩展Module以及ModuleLoader的步骤和代码示例。

自从 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 ,把需要对话的机制加进去才可以。

其工作原理图:

SequenceDiagram1

首先自定义一个 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/去下载源代码。

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值