[Flex]浅析Mate flex framework在实际项目中的应用(三)
| 浅析Mate flex framework在实际项目中的应用(三)
         浅析Mate flex framework在实际项目中的应用(三) 二、Injectors(依赖注入机制) 那么什么时候Injectors(依赖注入机制)呢? 具体可以看这里,人家已经描述的很清楚了,我就没有必要再重复一遍了:) 好吧,我们接着上篇文章的一个例子来说明一下,当C.mxml触发了dispatchEvent( new MyEvent( MyEvent.CLICK_ME ));后,会很容易的被EventMap传递到任何我想传递的地方。 代码如下: <EventMap xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="http://mate.asfusion.com/"> <mx:Script> <![CDATA[ import com.wonlen.test.A; ]]> </mx:Script> <EventHandlers type="{ MyEvent.CLICK_ME }"> <MethodInvoker generator="{ A }" method="myEventHandler" /> 
        而这个时候,我增加了一个需求: 我想让C不仅可以传递消息还想让A得到C传递过来的消息后,显示到UI上面。 例如:在A上面显示如下的内容:C跟你打了声招呼。我是A,我得到了你传递过来的消息。 为了降低A与C的耦合性,因此A是不知道C的存在的,而C也只会把自己的消息传递出去,而不会理会到底是A接受到,还是D接收到。 上面的一个需求其是就将mvc的特征体现出来到了,即显示层(v)、控制层(c)、逻辑层(m)独立分开。 okay,由于需要传递参数,所以需要改写MyEvent.as,增加一个public variable :name,代码如下: public class MyEvent extends Event { public static const CLICK_ME : String = "clickMe"; public var name : String; public function SupporterListEvent( type:String, bubbles:Boolean=false, cancelable:Boolean=false ) {       super( type, bubbles, cancelable ); } 注意:真正在实际应该用,不用直接采用public的方式,而是应该采用setter、getter的方式,这样可以更好的控制闭包。 okay,我们已经增加了一个变量:name,它的作用是用来保存触发者的名字。因此C.mxml的代码也需要稍微的修改一下,主要对name进行赋值。 var myEvent : MyEvent = new MyEvent( MyEvent.CLICK_ME );myEvent.name = "C"; dispatchEvent( myEvent ); 上面的代码比较简单,不做过多介绍。 然后在business文件夹下面增加一个AS文件:MyController.as,然后里面的内容如下: package com.wonlen.test.business {
        public class MyController{[Bindable] public var talk : String; // ---------------------------------------------------------- public function settingTalks() : void {  if ( type == "clickMe" ) { talk = name + "跟你打了声招呼。";}  else { talk = name + "离开了。";} }  }
        }上面的代码,也是比较简单的,增加了三个属性,type 和 name。它们的意义上分别是: 1、type:类型。 2、name:名字。 3、talk:保存经过设定后的字符串。 经过上面的修改,我们完成了事件携带值的修改和定义了一个controller性质的AS:MyController 接下来在A.mxml里面增加一些内容,例如如下的source: <?xml version="1.0" encoding="utf-8"?>
        <mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" title="A Panel">
        <mx:Script>
        <![CDATA[
        [Bindable]
        public var othertalks : String;
        ]]>
        </mx:Script>
        <mx:Label text="{ othertalks + '我是A,我得到了你传递过来的消息' }" />        </mx:Panel>我定义了一个变量:othertalks,它的作用是用于显示接收的内容。 那么MyEventMap应该如下修改呢?请看下面的代码: <EventMap xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="http://mate.asfusion.com/"> <mx:Script> <![CDATA[ import com.wonlen.test.A; ]]> </mx:Script> <EventHandlers type="{ MyEvent.CLICK_ME }"> 
        <MethodInvoker generator="{ MyController }" method="settingTalks"> 
        我现在重述一下上面的内容: 当在C中触发了MyEvent.CLICK_ME后,会在EventMap里面调用MyController,并且传入了type 和 name,然后通过settingTalks,最后得到了字符串talk。 然后将MyController.talk通过注入方式赋值给A.othertalks,最终显示在A上面:C跟你打了声招呼。我是A,我得到了你传递过来的消息。 其实经过以上的coding,就形成了一些简单的mvc方式。C只负责触发MyEvent.CLICK_ME,而它无须理会到底是给谁的。 同时A也只负责接收MyEvent.CLICK_ME的消息,而无须理会具体的逻辑是什么,只是单纯的显示得到的结果。 MyController封装了主要的业务逻辑,如果一但有需求变更的话,那么我们只负责修改MyController里面的逻辑即可。 由于这个例子比较小,因此我只使用了变量来代替vo。 截止到现在,Mate Flex framework的三个特点已经介绍完两个:EventMap(事件地图)、Injectors(依赖注入机制) 目前各位初学者完全可以使用这两者方式进行开发你的Flex project了。 | 
 
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号