Mate Flex Framework 流程介绍之Two-way Communication

游戏人日常 2011-07-09

Mate的双向通讯:分派和响应标签(DispatcherandResponseHandlertags)

请看一下流程图:

以自己的理解进行一下翻译:

1.1、我们在视图里面建立一个Matetag:Dispatcher,同时这个这个标签是一个ResponseHandlers类型的标签。

即我们在<Dispatcher>里面增加了一个<ResponseHandlers>的标签。代码如下:

<mate:Dispatcherid="messageDispatcher"generator="{MessageEvent}"type="{MessageEvent.GET}">

<mate:eventProperties>

<mate:EventPropertiesname="{inputName.text}"/>

</mate:eventProperties>

<mate:ServiceResponseHandlerresult="handleResult(event.result.text)"

fault="handleFault(event.fault.faultString)"/>

</mate:Dispatcher>

以上代码copay自:http://mate.asfusion.com/assets/content/examples/helloworld/srcview/

由于之前没有跟大家介绍过这个标签,因此我来进行一下解释。

a、我们定义了一个id=messageDispatcher的<Dispatcher>类型的Matetag。而它的作用就是代替Flex里面的dispatcherEvent。

b、在<Dispatcher>里面我们定义了一个属性标签:<eventProperties>,同时传入了一个属性(name)。

那么这个标签与<Properties>有什么区别呢?

<Properties>:用于类似<EventAnnouncer>这样的结构里面。它的作用也是传递一些属性。

<eventProperties>:根据它的命名我们可以得出,它是用在Dispatcher里面的,也就是说,它是EventProperties。

1.2、我们又在1.1的基础上增加了一个新的标签:<ServiceResponseHandler>,这个标签的作用就是定义一个关于service的相应标签。

而<Dispatcher>里面可以让我们得知,它具体有如下功能:

首先会dispatch某一个event,然后会给这个event传入一些参数,同时声明一个ServiceResponseHandler,作为响应这个event的接收器。

也就说,当这个事件触发后,会通过ServiceResponseHandler得到一些响应的结果。

2、将<Dispatcher>的内容发送给EventBus。(这个地方与one-wayCommunication是一致的)

3、EventBus将这个被触发的event交给EventMap里面。同时在EventMap里面也定义了相应的EventHandlertag用做接收EventBus送过来的消息。

4、在这些定义好的EventHandler里面,会有一组动作来响应这个Event(即从EventBus送过来的相同type的Event)

在上图中,EventHandler首先调用的是ServiceInvoker(也就是负责调用Service的标签)

5、当调用完ServiceInvoker后,会有一些返回值,然后将这些返回值当到某一个Class里面,因此使用了MethodeInvoker标签。

注意:这个MethodeInvoker调用的method,会返回值,而它的返回值我们使用如下的方式得到:lastReturn.XXXX。例如如下的代码:

<EventHandlerstype="{FlexEvent.INITIALIZE}">

<MethodInvokergenerator="{Initializer}"method="loadFlashVars"/>

<EventAnnouncergenerator="{WeatherEvent}"type="{WeatherEvent.GET}">

<Propertieslocation="{lastReturn.location}"unit="{lastReturn.unit}"/>

</EventAnnouncer>

</EventHandlers>

解释一下:

a、EventMap里面定义了一个用于接收类型为:FlexEvent.INITIALIZE的<EventHandler>。

b、当接收到后会调用Initializerclass里面的loadFlashVars这个method。

c、loadFlashVars具有一个返回值,当调用完loadFlashVars后,我们再次调用EventAnnouncer这个标签中的WeatherEvent.GET

(这个地方相当于触dispatchEvent(newMyEvent(WeatherEvent.GET)))

d、同时使用lastReturn.location和lastReturn.unit对WeatherEvent的两个属性:location和unit进行赋值。

以上代码在:http://mate.asfusion.com/assets/content/examples/weatherWidget/srcview/

6、根据上图所示,<EventHandler>再次调用了ResponseAnnouncer。

注意:<EventAnnouncer>是ResponseAnnouncer的一个具体的类型,而ResponseAnnouncer还包括<ServiceResponseAnnouncer>等

7、而调用<ResponseAnnouncer>的结果是,将<ResponseAnnouncer>发送给了EventBus。

8、而EventBus将<ResponseAnnouncer>响应的结果放在了<ResponseHandlers>

9、<ResponseHandlers>是在<Dispatcher>里面定义的结构,用于接收任何的响应事件。我们要做的就是在<ResponseHandlers>里面写上用于更新UI的操作。

以上就是双向通讯:分派和响应标签(DispatcherandResponseHandlertags)的全部流程图了。

这个流程图的重点部分:

它向我们展示了Dispatcher和ResponseHandler这两个Matetag的用法。通过以上的一些解耦,可以使我们将mvc彻底分离。

相关推荐

AiChinaTech / 0评论 2019-10-31
古桥科技 / 0评论 2019-10-21