本部分,将学习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 让操作发出登陆事件
package org.rianotes.CairngormSample.events
{
import com.adobe.cairngorm.control.CairngormEvent;
import flash.events.Event;
public class LoginEvent extends CairngormEvent {
public static const LOGIN:String = "Login";
public var UserID:String;
public var Password:String;
public function LoginEvent(submittedUserID:String,submittedPassword:String) {
UserID = submittedUserID;
Password = submittedPassword;
//透過super class 向監聽器發出此const
super(LOGIN);
}
override public function clone():Event {
return new LoginEvent(UserID,Password);
}
}
}
接着我们做一个对应的Command,在commands文件夹下建一个LoginCommand.as类,让它实现ICommand接口。
LoginCommand:接收到LoginEvent后,所需要做的处理。这里就负责将ModelLocator的workflowState值做改变。
代码如下:
package org.rianotes.CairngormSample.commands
{
import com.adobe.cairngorm.commands.ICommand;
import com.adobe.cairngorm.control.CairngormEvent;
import mx.controls.Alert;
import org.rianotes.CairngormSample.events.LoginEvent;
import org.rianotes.CairngormSample.model.ViewModelLocator;
public class LoginCommand implements ICommand {
public var model:ViewModelLocator = ViewModelLocator.getInstance();
public function LoginCommand(){
}
public function execute(event:CairngormEvent):void{
var loginEvent:LoginEvent = event as LoginEvent;
//COMMAND LOGIC
if(loginEvent.UserID=="eggant" && loginEvent.Password=="eggant")
{
model.workflowState = ViewModelLocator.MAIN_SCREEN;
}else
{
mx.controls.Alert.show("請確認帳號密碼是否正確!?");
}
}
}
}
接着我们在control文件夹下新增一个SampleController.as类,让它继承自FrontController。
SampleController:负责将LoginEvent对应到LoginCommand,就是接收到LoginEvent就指派给LoginCommand。
代码如下:
package org.rianotes.CairngormSample.control
{
import com.adobe.cairngorm.control.FrontController;
//因為負責Mapping events與commands這兩塊所以先import進來
import org.rianotes.CairngormSample.events.*;
import org.rianotes.CairngormSample.commands.*;
//繼承於FrontController
public class SampleController extends FrontController {
public function SampleController() {
this.initialize();
}
public function initialize():void{
//FrontController主要就是用來做Event Mapping的動作
//接收到什麼Event訊息,然後該做什麼Command,由這邊控制
//ADD COMMANDS
this.addCommand( LoginEvent.LOGIN, LoginCommand);
}
}
}
然后我们在LoginView.mxml作如下的修改,使用者点击Login Button就会dispatch LoginEvent
代码如下:
<?xml version="1.0" encoding="utf-8"?>
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
horizontalAlign="right" xmlns:components="org.rianotes.CairngormSample.view.components.*">
<mx:Script>
<![CDATA[
import org.rianotes.CairngormSample.events.LoginEvent;
import org.rianotes.CairngormSample.model.ViewModelLocator;
[Bindable]
private var model:ViewModelLocator = ViewModelLocator.getInstance();
private function login(e:MouseEvent):void{
var loginEvent:LoginEvent = new LoginEvent(ti_UserID.text,ti_Password.text);
loginEvent.dispatch();
}
]]>
</mx:Script>
<mx:Form borderStyle="solid" width="100%">
<mx:FormItem label="UserID :" width="100%">
<mx:TextInput id="ti_UserID" width="100%"/>
</mx:FormItem>
<mx:FormItem label="Password: " width="100%">
<mx:TextInput id="ti_Password" width="100%"/>
</mx:FormItem>
</mx:Form>
<mx:Button label="Login" click="login(event)" />
</mx:VBox>
最后在Main.mxml中加入SampleController
<?xml version="1.0" encoding="utf-8"?>
<mx:Application
xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:view="org.rianotes.CairngormSample.view.*"
layout="absolute" xmlns:control="org.rianotes.CairngormSample.control.*">
<mx:Script>
<![CDATA[
import org.rianotes.CairngormSample.model.ViewModelLocator;
[Bindable]
private var model:ViewModelLocator = ViewModelLocator.getInstance();
]]>
</mx:Script>
<!--Cairngorm:FrontController :讓app中擁有SampleController-->
<control:SampleController id="controller" />
<mx:ViewStack id="vsMain" width="100%" height="100%" selectedIndex="{model.workflowState}">
<!--第0個View-->
<view:LoginView />
<!--第1個View-->
<view:MainView />
</mx:ViewStack>
</mx:Application>
分享到:
相关推荐
Cairngorm框架主要由五大组件构成,分别是ModelLocator、ServiceLocator、Command、Event以及FrontController。ModelLocator类似于一个存放数据的仓库,用于存储程序中所有的值对象(ValueObjects)和共享变量。...
### Cairngorm深入解析 #### 一、Cairngorm框架简介 Cairngorm作为一款专门为Adobe Flex设计的模型视图控制器(Model-View-...无论是对于初学者还是经验丰富的开发者来说,掌握Cairngorm都是一项非常有价值的技能。
Cairngorm包含五大组件:ModelLocator用于数据存储,ServiceLocator管理服务,Command处理业务逻辑,Event处理事件触发,以及FrontController作为前端控制器,负责事件到命令的映射。 ModelLocator采用单例模式,...
3 Android SqliteManager 源码.zip
内容概要:本文详细介绍了基于S7-200 PLC的煤矿排水系统智能控制方案,重点讨论了三台水泵(两台工作水泵和一台备用水泵)的联动与备援策略。系统通过超声波液位传感器实时监测水位,根据不同水位情况自动控制水泵的启停。具体而言,水位低时不启动水泵,水位介于中水位和高水位之间时启动1号水泵,水位超过高水位则启动1号和2号水泵共同工作。若1号或2号水泵出现故障,系统会自动启用3号备用水泵。此外,MCGS6.2组态画面用于实时监控水位和水泵状态,帮助操作员及时应对异常情况,确保矿井安全。 适合人群:从事煤矿自动化控制领域的技术人员、矿业工程管理人员及相关研究人员。 使用场景及目标:适用于需要提高煤矿排水系统自动化水平的场合,旨在提升矿井排水效率和安全性,减少人工干预,确保矿井生产安全。 其他说明:文中提到的技术方案不仅提高了排水系统的可靠性,还为未来的智能化矿山建设提供了有益借鉴。
scratch少儿编程逻辑思维游戏源码-灌篮之王.zip
scratch少儿编程逻辑思维游戏源码-飞翔马里奥(2).zip
scratch少儿编程逻辑思维游戏源码-火柴人大战 中世纪战争.zip
scratch少儿编程逻辑思维游戏源码-几何冲刺(2).zip
南京证券-低轨卫星互联网启动,天地一体通信迈向6G
nginx-1.20.1
sshpass-1.06-8.ky10.aarch
少儿编程scratch项目源代码文件案例素材-我的世界2D(更新北极).zip
通信行业专题研究:车载全息数字人——AI+Agent新场景,全息投影新方向-20231121-国盛证券-13页
内容概要:本文详细介绍了利用西门子S7-200 PLC和组态王软件构建的邮件分拣系统的具体设计方案和技术细节。首先,文中阐述了硬件部分的设计,包括光电传感器、传送带电机以及分拣机械臂的连接方式,特别是旋转编码器用于精确测量包裹位移的技术要点。接着,展示了PLC编程中的关键代码段,如初始化分拣计数器、读取编码器数据并进行位置跟踪等。然后,描述了组态王作为上位机软件的作用,它不仅提供了直观的人机交互界面,还允许通过简单的下拉菜单选择不同的分拣规则(按省份、按重量或加急件)。此外,针对可能出现的通信问题提出了有效的解决方案,比如采用心跳包机制确保稳定的数据传输,并解决了因电磁干扰导致的问题。最后,分享了一些现场调试的经验教训,例如为减少编码器安装误差对分拣精度的影响而引入的位移补偿算法。 适合人群:从事自动化控制领域的工程师或者对此感兴趣的初学者。 使用场景及目标:适用于需要提高邮件或其他物品自动分拣效率的企业或机构,旨在降低人工成本、提升工作效率和准确性。 其他说明:文中提到的实际案例表明,经过优化后的系统能够显著改善分拣性能,将分拣错误率大幅降至0.3%,并且日均处理量可达2万件包裹。
scratch少儿编程逻辑思维游戏源码-机械汽车.zip
内容概要:本文详细探讨了在连续介质中利用束缚态驱动设计并实现具有最大和可调谐手征光学响应的平面手征超表面的方法。文中首先介绍了comsol三次谐波和本征手性BIC(束缚态诱导的透明)两种重要光学现象,随后阐述了具体的手征超表面结构设计,包括远场偏振图、手性透射曲线、二维能带图、Q因子图和电场图的分析。最后,通过大子刊nc复现实验验证了设计方案的有效性,并对未来的研究方向进行了展望。 适合人群:从事光学研究的专业人士、高校物理系师生、对光与物质相互作用感兴趣的科研工作者。 使用场景及目标:适用于希望深入了解手征超表面设计原理及其光学响应机制的研究人员,旨在推动新型光学器件的研发和技术进步。 其他说明:本文不仅展示了理论分析和模拟计算,还通过实验证明了设计方法的可行性,为后续研究奠定了坚实的基础。
少儿编程scratch项目源代码文件案例素材-位图冒险.zip
少儿编程scratch项目源代码文件案例素材-校园困境2.zip