(转)Cairngorm初学者入门教程 第五节--Cairngorm中Event,Command与FrontController的关系...

本部分,将学习Cairngorm的核心控制流程:

  • Events:通过使用者操作View所产生的事件,或其他设计所产生的事件。
  • Front Controller:Front Controller 用来注册Command与Events对应,接收Cairngorm Events并将他对应到Cairngorm Commands
  • Command: 操作Cairngorm Business以及呼叫Cairngorm Delegates,这些回传所取得的资料Command会再将它更新到Model Locator

首先介绍Cairngorm 的基本事件流程

使用者在操作View的过程会发出Event,然后由Front Controller来映射指派给对应的Command,Command做完运算处理后会更新ModelLocator的数据,然后View就会更新显示內容。

Front Controller在这里的角色有点像是Manager,专门负责嘴上工夫的,喔,不,其实是接收Event事件,然后指派给Command去做。

有点像是客户(user)跟业务(view)谈好,然后业务去告诉(Dispatch Event)Manager,然后Manager就很简单的说,丟给阿宅工程师(Command)去处理吧。阿宅工程师很辛苦的处理好后,把结果传给(Model),然后业务(view)就拿著结果去跟客户(User)讲,你看做好了,感觉怎样?

在实现这个项目上,我们首先建立好项目架构

在项目中建立events,control,commands三个文件夹。

在events文件夹中我们新增一个LoginEvent.as类,让它继承自CairngormEvent.

LoginEvent 让操作发出登陆事件
LoginEvent.as

01package org.rianotes.CairngormSample.events
02{
03    import com.adobe.cairngorm.control.CairngormEvent;
04      
05    import flash.events.Event;
06      
07    public class LoginEvent extends CairngormEvent {
08          
09        public static const LOGIN:String = "Login";
10          
11        public var UserID:String;
12        public var Password:String;
13          
14        public function LoginEvent(submittedUserID:String,submittedPassword:String) {
15              
16            UserID = submittedUserID;
17            Password = submittedPassword;
18              
19            //透過super class 向監聽器發出此const
20            super(LOGIN);   
21        }
22          
23        override public function clone():Event {
24            return new LoginEvent(UserID,Password);
25        }
26          
27    }
28}

接着我们做一个对应的Command,在commands文件夹下建一个LoginCommand.as类,让它实现ICommand接口。

LoginCommand:接收到LoginEvent后,所需要做的处理。这里就负责将ModelLocator的workflowState值做改变。

代码如下:

01package org.rianotes.CairngormSample.commands
02{
03    import com.adobe.cairngorm.commands.ICommand;
04    import com.adobe.cairngorm.control.CairngormEvent;
05   
06    import mx.controls.Alert;
07   
08    import org.rianotes.CairngormSample.events.LoginEvent;
09    import org.rianotes.CairngormSample.model.ViewModelLocator;
10   
11    public class LoginCommand implements ICommand {
12   
13        public var model:ViewModelLocator = ViewModelLocator.getInstance();
14   
15        public function LoginCommand(){
16   
17        }
18   
19        public function execute(event:CairngormEvent):void{
20            var loginEvent:LoginEvent = event as LoginEvent;
21   
22            //COMMAND LOGIC
23            if(loginEvent.UserID=="eggant" && loginEvent.Password=="eggant")
24            {
25                model.workflowState = ViewModelLocator.MAIN_SCREEN;
26            }else
27            {
28                mx.controls.Alert.show("請確認帳號密碼是否正確!?");
29            }
30        }
31   
32    }
33}

 

接着我们在control文件夹下新增一个SampleController.as类,让它继承自FrontController。

SampleController:负责将LoginEvent对应到LoginCommand,就是接收到LoginEvent就指派给LoginCommand。

代码如下:

01package org.rianotes.CairngormSample.control
02{
03    import com.adobe.cairngorm.control.FrontController;
04   
05    //因為負責Mapping events與commands這兩塊所以先import進來
06    import org.rianotes.CairngormSample.events.*;
07    import org.rianotes.CairngormSample.commands.*;
08   
09    //繼承於FrontController
10    public class SampleController extends FrontController {
11   
12        public function SampleController() {
13            this.initialize();
14        }
15   
16        public function initialize():void{
17   
18            //FrontController主要就是用來做Event Mapping的動作
19            //接收到什麼Event訊息,然後該做什麼Command,由這邊控制
20   
21            //ADD COMMANDS
22            this.addCommand( LoginEvent.LOGIN, LoginCommand);
23   
24        }
25   
26    }
27}

 

然后我们在LoginView.mxml作如下的修改,使用者点击Login Button就会dispatch LoginEvent

代码如下:

01<?xml version="1.0" encoding="utf-8"?>
02<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
03horizontalAlign="right" xmlns:components="org.rianotes.CairngormSample.view.components.*">
04    <mx:Script>
05        <![CDATA[
06            import org.rianotes.CairngormSample.events.LoginEvent;
07            import org.rianotes.CairngormSample.model.ViewModelLocator;
08            [Bindable]
09            private var model:ViewModelLocator = ViewModelLocator.getInstance();
10   
11            private function login(e:MouseEvent):void{
12                var loginEvent:LoginEvent = new LoginEvent(ti_UserID.text,ti_Password.text);
13                loginEvent.dispatch();    
14            }
15   
16        ]]>
17    </mx:Script>
18    <mx:Form borderStyle="solid" width="100%">
19        <mx:FormItem label="UserID :" width="100%">
20             <mx:TextInput id="ti_UserID" width="100%"/>
21        </mx:FormItem>
22   
23        <mx:FormItem label="Password: " width="100%">
24            <mx:TextInput id="ti_Password" width="100%"/>
25        </mx:FormItem>
26   
27    </mx:Form>
28    <mx:Button label="Login" click="login(event)" />
29</mx:VBox>

 

最后在Main.mxml中加入SampleController

代码如下:

01<?xml version="1.0" encoding="utf-8"?>
02<mx:Application 
04 xmlns:view="org.rianotes.CairngormSample.view.*"
05 layout="absolute" xmlns:control="org.rianotes.CairngormSample.control.*">
06   
07    <mx:Script>
08        <![CDATA[
09            import org.rianotes.CairngormSample.model.ViewModelLocator;
10            [Bindable]
11            private var model:ViewModelLocator = ViewModelLocator.getInstance();
12        ]]>
13    </mx:Script>
14   
15    <!--Cairngorm:FrontController :讓app中擁有SampleController-->
16    <control:SampleController id="controller" />
17   
18    <mx:ViewStack id="vsMain" width="100%" height="100%" selectedIndex="{model.workflowState}">  
19   
20        <!--第0個View-->
21        <view:LoginView />
22       
23        <!--第1個View-->
24        <view:MainView />
25  
26    </mx:ViewStack> 
27</mx:Application>

转载于:https://www.cnblogs.com/yangxiao24/archive/2010/05/14/1735068.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值