[Flex]Mate Flex Framework 流程介绍之Two-way Communication:Dispatcher and ResponseHandler tags

Mate Flex Framework 流程介绍:
Mate Flex Framework 流程介绍之From views to business logic
Mate Flex Framework 流程介绍之Dispatcher and ResponseHandler tags
Mate Flex Framework 流程介绍之Listener tag
Mate Flex Framework 流程介绍之Using an adapter
Mate Flex Framework 流程介绍之Using view injection

今天向大家介绍一下,双向通讯:分派和响应标签(Dispatcher and ResponseHandler tags)
看一下流程图:


还是老规矩,我把原本的流程介绍去掉了,然后以自己的理解进行一下翻译:
1.1、我们在视图里面建立一个mate tag:Dispatcher ,同时这个这个标签是一个ResponseHandlers类型的标签。
      即我们在<Dispatcher>里面增加了一个<ResponseHandlers>的标签。代码如下:

      <mate:Dispatcher id="messageDispatcher" generator="{MessageEvent}" type="{MessageEvent.GET}">
           <mate:eventProperties>
               <mate:EventProperties name="{inputName.text}"/>
           </mate:eventProperties>
 
           <mate:ServiceResponseHandler result="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>类型的mate tag。而它的作用就是代替Flex里面的dispatcherEvent。
       b、在<Dispatcher>里面我们定义了一个属性标签:<eventProperties>,同时传入了一个属性(name)。
       那么这个标签与<Properties>有什么区别呢?
       <Properties>:用于类似<EventAnnouncer>这样的结构里面。它的作用也是传递一些属性。
       <eventProperties>:根据它的命名我们可以得出,它是用在Dispatcher里面的,也就是说,它是Event Properties。
1.2、我们又在1.1的基础上增加了一个新的标签:<ServiceResponseHandler>,这个标签的作用就是定义一个关于service的相应标签
         而<Dispatcher>里面可以让我们得知,它具体有如下功能:
        首先会dispatch某一个event,然后会给这个event传入一些参数,同时声明一个ServiceResponseHandler,作为响应这个event的接收器。
        也就说,当这个事件触发后,会通过ServiceResponseHandler得到一些响应的结果。
  2、将<Dispatcher>的内容发送给Event Bus。(这个地方与one-way Communication是一致的)
  3、Event Bus将这个被触发的event交给Event Map里面。同时在Event Map里面也定义了相应的EventHandler tag用做接收Event Bus送过来的消息。
  4、在这些定义好的EventHandler里面,会有一组动作来响应这个Event(即从Event Bus送过来的相同type的Event)
        在上图中,EventHandler首先调用的是ServiceInvoker(也就是负责调用Service的标签)
  5、当调用完ServiceInvoker后,会有一些返回值,然后将这些返回值当到某一个Class里面,因此使用了MethodeInvoker标签。
        注意:这个MethodeInvoker调用的method,会返回值,而它的返回值我们使用如下的方式得到:lastReturn.XXXX。例如如下的代码:
       <EventHandlers type="{FlexEvent.INITIALIZE}"> 
           <MethodInvoker generator="{Initializer}" method="loadFlashVars" />
           <EventAnnouncer generator="{WeatherEvent}" type="{WeatherEvent.GET}">
               <Properties location="{lastReturn.location}" unit="{lastReturn.unit}" />
           </EventAnnouncer>
      </EventHandlers>
     解释一下:
     a、Event Map里面定义了一个用于接收类型为: FlexEvent.INITIALIZE的<EventHandler>。
     b、当接收到后会调用Initializer class里面的loadFlashVars这个method。
     c、loadFlashVars具有一个返回值,当调用完loadFlashVars后,我们再次调用EventAnnouncer这个标签中的WeatherEvent.GET
      (这个地方相当于触dispatchEvent( new MyEvent( WeatherEvent.GET ))
     d、同时使用lastReturn.location 和 lastReturn.unit 对WeatherEvent的两个属性:location 和 unit进行赋值。
 
  6、根据上图所示,<EventHandler>再次调用了ResponseAnnouncer。
        注意:<EventAnnouncer>是ResponseAnnouncer的一个具体的类型,而ResponseAnnouncer还包括<ServiceResponseAnnouncer >等
  7、而调用<ResponseAnnouncer>的结果是,将<ResponseAnnouncer>发送给了Event Bus
  8、而Event Bus将<ResponseAnnouncer>响应的结果放在了<ResponseHandlers>
  9、<ResponseHandlers>是在<Dispatcher>里面定义的结构,用于接收任何的响应事件。我们要做的就是在<ResponseHandlers>里面写上用于更新UI的操作。
 
以上就是 双向通讯:分派和响应标签(Dispatcher and ResponseHandler tags)的全部流程图了。
 
这个流程图的重点部分:
它向我们展示了Dispatcher 和 ResponseHandler  这两个mate tag的用法。通过以上的一些解耦,可以使我们将mvc彻底分离。