Cairngorm2.2 框架中六大元素:
bussiness(services,delegate),commands ,control(FrontController和Event),model(modelLocator),view,vo
FLex 中框架Carngorm的流程和工作原理
1。View 不但负责显示数据,他换负责派遣事件(Event),通过CairngormEventDispatcher类的getInstance()方法获得唯一的一个CairngormEventDispatcher类型的实例,并且使用这个实例的dispatchEvent方法派遣相应的事件,以便给FrontController捕获这个事件,这个是CairngormEvent类型的,程序元扩展这个事件,使用它可以携带一些数据。
如:点击添加事件:
public function addContact() : void
{
//构建VO对象
var contactVO : ContactVO = new ContactVO();
contactVO.fullname = fullname.text;
contactVO.emailaddress = emailaddress.text;
// 创建事件
var event : AddContactEvent = new AddContactEvent( contactVO );
//转发事件
CairngormEventDispatcher.getInstance().dispatchEvent( event );
}
2。一旦View派遣了一个事件,FrontController捕获这个事件通过addCommand方法把这个事件映射到相应的Command,同时这个事件所携带的数据也一同传递给那个Command了。
FrontController中相等于一个HashMap对象
protected var commands : Dictionary = new Dictionary();
其中
添加命令的方法:
public function addCommand( commandName : String, commandRef : Class, useWeakReference : Boolean = true ) : void
删除命令的方法:
public function removeCommand( commandName : String ) : void
执行命令方法的
protected function executeCommand( event : CairngormEvent ) : void
Responder接口必须实现的方法:
function onResult( event : * = null ) : void;
function onFault( event : * = null ) : void;
命令必须实现的接口:Command,Responder接口
在自定义控制器中继承子前端控制器(FrontController类)
必须调用父类的方法注册事件的Command命令
如下:
public class AddContactControl extends FrontController
{
public function AddContactControl()
{
addCommand( AddContactControl.EVENT_ADD_CONTACT, AddContactCommand );
}
public static const EVENT_ADD_CONTACT : String = "addcontact";
}
模型控制器必须继承自ModelLocator类,
同时声明操作对象
VO必须继承子ValueObject对象。
3。commands通过execute()方法接受那个事件,然后执行需要的动作,如果需要与后台打交道(例如提交数据或读取数据),那就要通过Delegate来跟后台大交道了,Delegate负责选择rpc(这个rpc在services里定义好并先在DefaultApplication里实例化),然后启动他,需要提交的数据是由那个事件携带的,command接收事件后,把事件所携带的数据由Delegate处理,在这里,Delegate会有result(data:Object)和fault(info:object)方法,当提交数据成功或失败后调用,然而在这两个方法里,都会获取相应的处理结果(例如提交成功后会接收后台返回的数据,这些数据被存放在data参数的result属性里)通常在这两个方法里,把处理结束后的得到的数据传回给command(类似的在command里也有result和fault方法,然后由command处理这些数据例如用于更新ModelLocator)
Command 命令类必须实现接口:ICommand 实现方法 function execute( event : CairngormEvent ) : void;
4。如果command通过execute方法接收事件后并不需要与后台打交道,那就不需要Delegate了,直接达到第五步
5。command更新ModelLocator 里的数据,无论之前的走那一步,必须更新ModelLocator大概都是必须的。
6。一旦ModelLocator被更新,view里的数据也自动更新,因为View绑定了ModelLocator,view的数据由ModelLocator提供的。