FLex 中框架Carngorm的流程跟工作原理(转)

FLex 中框架Carngorm的流程和工作原理(转)
关键字: flex 中框架carngorm的流程和工作原理
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提供的。

源自;http://topmanopensource.iteye.com/blog/427772