Flex学习笔记

什么是Cairngorm?

Cairngorm(中文名:“烟水晶”?)是一个轻量级的Flex RIA程序开发框架,从而使程序可扩展性、可维护性都大大提高,其本身并不是一个完整的企业应用,它只是提供了一个开发骨架,Adobe称之为体系。

Cairngorm体系

主要包括以下几个部分:

1、VO(Value Object)

IValueObject 和 ValueObject 只是为了提高VO类的可读性,表示该类是一个ValueObject类,其它没有任何实际作用。其可能是为将来而设计的,我们在应用过程中不需要实现任何接口函数。

2、Model

定义了ModelLocator接口,我们只需要实现该接口,把所需要绑定的数据保存在这里。通常我们都采用单例模式(Singleton Pattern)来实现,并按照项目模块进行分类,避免把整个项目的所有数据都保存在一个类文件中。换句话说,ModelLocator是整个系统的数据中心。

3、View

有ViewHelper.as 和 ViewLocator.as,在Cairngorm2.2.1版本中已被废除。

4、Commands

定义了ICommand接口,该接口定义了一个唯一需要实现的方法execute(),这其实就是典型的命令模式,我们只要实现此接口,并不需要关心其具体实现方式。

5、Control

含三个基类:CairngormEvent、CairngormEventDispatcher和FrontController。
(1)CairngormEvent:
继承flash.events.Event,其包含一个data成员,用来传递参数数据之用。
(2)CairngormEventDispatcher:
采用单例模式(Singleton Pattern),用来广播用户发起的自定义动作事件。
(3)FrontController:
相当于控制中心,在这里你要做的工作是将事件(CairngormEvent)和命令(Command)之间的映射关系注册在它的
成员commands(Dictionary类型)中,通过下面的类似方法进行注册:
addCommand( GetProductsEvent.EVENT_GET_PRODUCTS, GetProductsCommand );
以后,凡是CairngormEventDispatcher广播出来的事件,首先都会在这里查找,找到对应的event对应的command后,
便执行Command的execute()方法。

FrontController必须要在你的系统中实例化,具体的实例化方法如下:
1 <mx:Application xmlns:control="com.domain.projectname.control.ShopController">
2 ...
3 <control:ShopController id="controller" />
4 ...
5 </mx:Application>

6、Business

IServiceLocator接口:
提供了HTTPService、WebSercice、RemoteObject三种RPC服务。使用时候,将需要的RPC服务登记在该接口中,
以mxml形式采用单例模式(Singleton Pattern)实现IServiceLocator,如下面使用例子:

1 <cairngorm:ServiceLocator
2 xmlns:mx="http://www.adobe.com/2006/mxml"
3 xmlns:cairngorm="http://www.adobe.com/2006/cairngorm">
4
5 <mx:RemoteObject id="productService" destination="productServiceImpl" showBusyCursor="true">
6 </mx:RemoteObject>
7
8 <mx:RemoteObject id="creditCardService" destination="creditCardServiceImpl" showBusyCursor="true">
9 </mx:RemoteObject>
10
11 <mx:HTTPService id="XXXService" url="URL" showBusyCursor="true" useProxy="false" resultFormat="e4x">
12 </mx:HTTPService>
13
14 </cairngorm:ServiceLocator>

需要在系统中实例化,具体的实例化方法如下:

1 <mx:Application xmlns:business="com.adobe.cairngorm.samples.store.business.*">
2 ...
3 <business:Services id="services" />
4 ...
5 </mx:Application>

在某个Delegate类中的使用方法:

1 this.service = ServiceLocator.getInstance().getRemoteObject( "productService" );

之后,就可以进行相关的函数调用了。

 


(1)前端控制器(FrontController)监听用户行为

前端控制品是Cairngorm事件的唯一监听者,但其不并做任何操作,只是集中注册并管理事件(Event)与命今(Command)的映射关系。

(2)命令(Commands)执行所有用户操作

前端控制品(FrontController)监听到事件与命令有匹配时,便告诉命令(Commmands)调用execute()方法处理事件。

(3)服务器端业务逻辑委托给Business Delegate

当命令(Commands)执行时,它只是关心是否获取到数据,而并不关心获取到什么具体数据。因为经常需要从服务器端获取数据,此时命令(Commands)更喜欢把它委托给其它类去操作。所以需要处理服务器端业务逻辑的时候,你都可以委托给命令(Commands)可以调用的Business Delegate类去处理。

(4)Business Delegate在Service Locator中寻找RPC Services

Business Delegate给命令(Commands)和RPC Services提供一个无缝接口。Business Delegate通过查找和匹配 PRC Services的名称来调用services并返回结果给命令(Commands)。命令(Commands)要从Business Delegate获取返回结果数据必须通过IResponder接口(mx.rpc.IResponder),只有这样Business Delegate才知道命命令(Commands)有onResult()和onFault()来处理返回的数据。

(5)把数据存储为Value Objecs

强烈推荐把数据存储为Value Objects。

(6)在Model Locator保存状态并且让Model通知View

Model Locator是一个保存应用程序全部状态和包含Value Objects的地方。当应用程序状态改变时,Moel Locator 通过Data Binding方式来通知View改变。


Caringorm控制流程

当Caringorm应用程序增加新需求时,下面是一个简单的操作步聚:

(1)创建或修改Value Objects;

(2)在Front Controller中使用AddCommand()方法注册新的事件(Event)和命令(Command)的映射关系。

(3)创建新的命令(Command):

            A)实现execute()方法;

            B)实现处理从服务器端返回数据的onResult()方法

                        i)更新Model Locator的结果;

                        ii)Model Locator自动通知View显示。

(4)增加命令(Command)委托Business Delegate的服务调用;

(5)如果需要新的RPC Services,添加至Service Locator。

调试Caringorm应用程序步聚

当Caringorm程序功能,不能正常响应时,一般按以下五个步聚操作调试:

(1)检查Front Controller是否已经注册事件;

(2)检查Command中的execute()是否已经被Controller调用;

(3)检查是否正确调用委托方法;

(4)检查Command中的onResult()是否已经被调用;

(5)检查Model Locator是否已经更新。

 

 

一、使用WebService

在Services.mxml中你须建立WebService服务,如:

1 <mx:WebService id="自定义ID" wsdl="{您的wsdl地址}" useProxy="false">
2 <mx:operation name="wsdl中的方法名"/>
3 </mx:WebService>



1 <mx:webservice>
2 id="自定义ID"
3 wsdl="{您的wsdl地址}"
4 useProxy="false">
5 <mx:operation concurrency="multiple" name="wsdl中的方法名1" />
6 <mx:operation concurrency="multiple" name="wsdl中的方法名2" />
7 </mx:webservice>

其实和平常定义的WebService没有两样,只是不须添加<mx:request>标签。

在AS3中的调用方法,如:

1 package cn.soave.flexblog.business
2{
3 import com.adobe.cairngorm.business.ServiceLocator;
4
5 import mx.rpc.IResponder;
6
7 public class BlogDelegate
8 {
9 private var service:Object;
10 private var responder:IResponder
11
12 public function BlogDelegate(responder:IResponder)
13 {
14 this.responder = responder;
15 }
16
17 /*获取最新更新的博客文章列表*/
18 public function getLastBlogList(参数1,参数2):void
19 {
20 this.service = ServiceLocator.getInstance().getWebService("自定义的WebService标签ID");
21 var call:AsyncToken= this.service.WebService中的方法名(参数1,参数2);
22 call.addResponder(this.responder);
23 }
24
25 }
26 }

二、使用HTTPService

在Services.mxml中你须建立HTTPService服务,如:

1 <mx:httpservice id="自定义标识ID" url="您的网页URL" showBusyCursor="true" method="POST" resultFormat="text"/>

在AS3中调用的方法,如:

1 package cn.soave.flexblog.business
2{
3 import com.adobe.cairngorm.business.ServiceLocator;
4
5 import mx.rpc.AsyncToken;
6 import mx.rpc.IResponder;
7
8 public class BlogDelegate
9 {
10 private var service:Object;
11 private var responder:IResponder
12
13 public function BlogDelegate(responder:IResponder)
14 {
15 this.responder = responder;
16 }
17
18 public function getUser():void
19 {
20 this.service = ServiceLocator.getInstance().getHTTPService("自定义的HTTPService标签ID");
21 var call:AsyncToken = this.service.send({参数1,参数2,...});
22 call.addResponder(this.responder);
23 }
24
25 }
26 }

备注:

处理正常或异常结果的Responder接口
Responder接口定义了两个抽象的方法:onResult方法和onFault方法
package{
   public interface Responder{
    function _disibledevent= null):void;
    function _disibledevent= null):void;
}
}

查找服务的ServiceLocator类
ServiceLocator类用于查找服务,如<mx:HTTPService>、<mx:WebService>等。
getService     获取AbstractService服务
getInvokerService   获取AbstractInvoker服务
getRemoteObject    获取RemoteObject服务
getHTTPService    获取HTTPService服务
getWebService    获取WebService服务
getDataService    获取DataService服务
getServices     获取AbstractInvoker服务数组
getHTTPServices    获取HTTPService服务数组
getDataServices    获取DataService服务数组
其中,getService方法的有点是可以获得任何类型服务,缺点是效率不高。
public function getService(serviceId:String): AbstractService{
   return AbstractService(getServiceForId(serviceId));
}
ServiceLocator类中还定义对服务设置的方法,如setMessageAgentCredentials、setHTTPServiceCredentials等。

处理事件的Command类
Command类继承于ICommand接口,用于处理某一事件。ICommand接口中定义了execute抽象方法,用于执行相应处理。

创建事件的CaringormEvent类
CaringormEvent类用于定义用户事件。包含一个成员变量data和一个构造函数。data变量可以存储任何类型的数据。

管理事件的CaringormEventDispatcher类用于管理事件。
getInstance     获取累的一个实例
addEventListener    添加事件监听
removeEventListener   移除事件监听
dispatchEvent     广播事件
hasEventListener    是否有事件监听
willTrigger     是否可以触发

监听事件的FrontController类
FrontController类用于监听事件。一旦事件发生,前台控制器找到事件的相应处理命令类执行。
addCommand     监听事件,并添加事件的处理命令
executeCommand    执行命令
getCommand     获得命令

存储数据模型的ModelLocator类
ModelLocator类是一种接口,用于应用程序的数据模型。可将应用程序需要显示的数据及状态变量都定义在ModelLocator类中。ModelLocator类相当于应用程序的“数据库”,方便修改与删除。

辅助操作视图的ViewHelper类
ViewHelper类用于辅助操作视图。使用ViewHelper类可在as文件中修改其他MXML文件中的视图。ViewHelper类中定义了两个成员变量:view和id。view变量为Object类型,存储了使用ViewHelper类的MXML文件的全部组件视图。id变量为ViewHelper类的标识符。
initialized     初始化ViewHelper,包括view和id变量。
registerView    注册试图
unregisterView    撤销注册视图

查找视图的viewLocator类
viewLocator类用以查找视图,即查找ViewHelper类的实例。
getInstance     获取viewLocator类实例
register     注册视图
unregister     取消注册视图
getViewHelper    根据ViewHelper类id获取ViewHelper类实例
registrationExistsFor 视图是否已注册

定义数据模型的ValueObject类
ValueObject类继承于IValueObject类,而IValueObject接口主要用于定义数据模型。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值