项目中要用到 PureMVC 的多模块通信,就好好研究了一下这个框架。
下载:https://github.com/PureMVC/puremvc-as3-multicore-framework
网上的的教程比较多,而且也有官方的网站的demo,对我们来说真是好消息。
先来了解一些名词:
Junction 就是一个连接点,可以允许管道连接。
TeeSplit 就是一个分发消息装置。
TeeMeger就是一个接受消息装置。
Pipe 就是管道。它没有方向之分,只有跟那些消息装置连接后才会有方向。
那么现在开始干活吧。
第一步:在主APP初始化时候:
protected function application1_initializeHandler(event:FlexEvent):void
{
junction.registerPipe(PipeAwareModule.APP_TO_MODULE_PIPE,Junction.OUTPUT,new TeeSplit());
junction.registerPipe(PipeAwareModule.MODULE_TO_APP_PIPE,Junction.INPUT,new TeeMerge());
junction.addPipeListener(PipeAwareModule.MODULE_TO_APP_PIPE,this,handlePipeMessage);
}
这一步就是在APP上注册好分发,接受消息的装置,并侦听接受消息的装置。(参考First step 图片)
第二步:module的代码:
<?xml version="1.0" encoding="utf-8"?>
<mx:Module xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
implements="org.puremvc.as3.multicore.utilities.pipes.interfaces.IPipeAware"
xmlns:mx="library://ns.adobe.com/flex/mx"
layout="horizontal" width="400" height="300"
name="module1">
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<fx:Script>
<![CDATA[
import com.model.constant.PipeAwareModule;
import mx.events.FlexEvent;
import org.puremvc.as3.multicore.utilities.pipes.interfaces.IPipeFitting;
import org.puremvc.as3.multicore.utilities.pipes.interfaces.IPipeMessage;
import org.puremvc.as3.multicore.utilities.pipes.messages.Message;
import org.puremvc.as3.multicore.utilities.pipes.plumbing.Junction;
import org.puremvc.as3.multicore.utilities.pipes.plumbing.Pipe;
import org.puremvc.as3.multicore.utilities.pipes.plumbing.TeeMerge;
import org.puremvc.as3.multicore.utilities.pipes.plumbing.TeeSplit;
public var junction:Junction = new Junction();
public function acceptInputPipe(name:String, pipe:IPipeFitting):void
{
if ( junction.registerPipe(name, Junction.INPUT, pipe))
{
junction.addPipeListener( name, this, handlePipeMessage );
}
}
public function acceptOutputPipe(name:String, pipe:IPipeFitting):void
{
junction.registerPipe( name, Junction.OUTPUT, pipe );
}
public function handlePipeMessage(message:IPipeMessage):void
{
switch (message.getType())
{
case PipeAwareModule.SHELL_MESSAGE:
{
text.text = message.getBody() as String;
break;
}
}
}
protected function btn_clickHandler(event:MouseEvent):void
{
var msg:Message = new Message(PipeAwareModule.MODULE_MESSAGE,null,"Hi,I am from Module");
junction.sendMessage(PipeAwareModule.MODULE_TO_APP_PIPE,msg);
}
]]>
</fx:Script>
<mx:Text id="text" text=""/>
<s:Button id="btn" label="send" click="btn_clickHandler(event)"/>
</mx:Module>
在module 中你要实现org.puremvc.as3.multicore.utilities.pipes.interfaces.IPipeAware 接口,并在接受消息的管道处侦听到来的消息。
第三部:在APP中生成管道并连接APP 和 Module。
<mx:ModuleLoader url="ModuleApp.swf" ready="moduleloader1_readyHandler(event)"/>
private var moduleApp:IPipeAware;
protected function moduleloader1_readyHandler(event:ModuleEvent):void
{
var child:Module = event.target.child as Module;
child.addEventListener(FlexEvent.INITIALIZE,onModuleInitialize);
}
private function onModuleInitialize(event:FlexEvent):void
{
moduleApp = event.target as IPipeAware;
registerJunction();
}
private function registerJunction():void
{
var moduleToAppPipe:Pipe = new Pipe();
moduleApp.acceptOutputPipe(PipeAwareModule.MODULE_TO_APP_PIPE,moduleToAppPipe);
var appIn:TeeMerge = junction.retrievePipe(PipeAwareModule.MODULE_TO_APP_PIPE) as TeeMerge;
appIn.connectInput(moduleToAppPipe);
var appToModulePipe:Pipe = new Pipe();
moduleApp.acceptInputPipe(PipeAwareModule.APP_TO_MODULE_PIPE,appToModulePipe);
var appOut:TeeSplit = junction.retrievePipe(PipeAwareModule.APP_TO_MODULE_PIPE) as TeeSplit;
appOut.connect(appToModulePipe);
}
在这一步,建立管道并且分别连接APP和Module。(参见 Second Step)
第四步:APP发送消息,测试。
<s:Button label="Send to module" click="button1_clickHandler(event)"/>
protected function button1_clickHandler(event:MouseEvent):void
{
var msg:Message = new Message(PipeAwareModule.SHELL_MESSAGE,null,"Hi,I am Form App");
junction.sendMessage(PipeAwareModule.APP_TO_MODULE_PIPE,msg);
}
至此,APP - Module和 Module - APP已经可以互相发送消息了。
如果有多个Module,只要在app junction 上再注册TeeSplit 和 TeeMeger(用不同的名字),然后用不同的管道连接起来app 和 module 就可以了。
然后你可以通过app 中转来实现module 和 module 之间的通信。这里就不在多说了,我会把源文件贴到附件中,可以下载下来看看。
本文介绍如何使用PureMVC框架实现多模块间的通信。主要步骤包括:在主应用中初始化连接点和消息分发器;在模块中实现消息接收和发送逻辑;建立管道连接主应用和模块;最后测试消息传递功能。
1028

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



