|
楼主 |
发表于 2008-5-9 20:56
|
显示全部楼层
step3
第三步。。。
现在MVC有了Model 和 View 只欠一个Controller了
这一步的内容包括:
1,Event
2,FrontController
3,Command
事件模型在flash里占有很大份量,相关内容可以看看这里,如果看不明白建议翻下相关文档(flexbuilder自带文档就很不错)
原网站上对MVC的描述:
有了对“事件”,view就可以轻松解除对model的依赖了
当然,如果你了解了什么是事件,想必对观察者(observer)模式不会陌生
当登陆按钮被点击时,发布LoginEvent事件。
models/loginForm.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml"
layout="horizontal">
<mx:Script>
<![CDATA[
import Models.*;
import events.*;
private var m:MyModel=MyModel.getInstance();
private function login():void{
var u:String=ti_uname.text;
var p:String=ti_pwd.text;
//这里可以做一些如检查输入是否为空的操作然后再触发事件
//本例从简
var le:LoginEvent=new LoginEvent(u,p);
le.dispatch();//这里的事件分发形式有点奇特。。
}
]]>
</mx:Script>
<mx:Form>
<mx:FormItem label="userName用户名:">
<mx:TextInput id="ti_uname" />
</mx:FormItem>
<mx:FormItem label="password密码:">
<mx:TextInput displayAsPassword="true" id="ti_pwd" />
</mx:FormItem>
<mx:FormItem label="">
<mx:Button label="登陆LOGIN" id="bt_submit" click="login()"/>
</mx:FormItem>
</mx:Form>
</mx:TitleWindow>
再来看看LoginEvent和FrontController:
events/LoginEvent.as
package events{
import com.adobe.cairngorm.control.CairngormEvent;
import flash.events.Event;
public class LoginEvent extends CairngormEvent{
//事件的名称
public static const LOGIN:String="LOGIN";
public var username:String;
public var passwd:String;
public function LoginEvent(
submittedUsername:String,
submittedPassword:String,
bubbles:Boolean=false,
cancelable:Boolean=false
){
this.username=submittedUsername;
this.passwd=submittedPassword;
super(LOGIN, bubbles, cancelable);
}
//因为添加了username和password两个属性,如果用原来的clone函数,会丢掉这两个参数
override public function clone():Event{
return new LoginEvent(username,passwd);
}
}
}
一般意义上的MVC中C负责的是逻辑的处理,而FrontControl这种方式
则是把逻辑方面的事分给了Command (这里是否就是传说中的Command模式?)
FrontController只是事件与Command之关的传话筒。
(据我所知的PHP框架都是用这种MVC,当然,在PHP这种层面应用中,“事件”就是用户的请求)
control/MyController.as
package control{
import com.adobe.cairngorm.control.FrontController;
import commands.*;
import events.*;
public class MyController extends FrontController{
public function MyController(){
super();
//绑定登陆事件与登陆处理逻辑
//是不是很像 addEventListener(someEvent, someCallBack ) ?
//只不过不同的是这里的callBack是class
//在事件触发时才被实例化并肯执行其excute函数
this.addCommand(LoginEvent.LOGIN,LoginCommand);
}
}
}
对登陆的逻辑处理:
commands/LoginCommand.as
package commands{
import Models.*;
import com.adobe.cairngorm.commands.ICommand;
import com.adobe.cairngorm.control.CairngormEvent;
import events.*;
public class LoginCommand implements ICommand{
public var m:MyModel=MyModel.getInstance();
public function LoginCommand(){
//所有的Command类都是工厂模式中被构造?
}
//被动调用,这个是vistor模式还是Observe模式?
public function execute(event:CairngormEvent):void{
var le:LoginEvent = event as LoginEvent;
if( this._checkLogin(le.username,le.passwd) ){
//登陆成功
//进入欢迎界面
m.currentState=MyModel.WELCOME;
}else{
//发布登陆失败事件
}
}
private function _checkLogin(u:String,p:String):Boolean{
//这里应该有对主机的请求,下回说明,这里只作一个简单的模拟
if(u=="a" && p=="a"){
return true;
}
return false;
}
}
}
在主程序里引入FrontController:
main.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
xmlns:v="views.*"
xmlns:c="control.*"
>
<mx:Script>
<![CDATA[
import Models.MyModel;
[Bindable]
public var m:MyModel=MyModel.getInstance();
]]>
</mx:Script>
<c:MyController id="controller" />
<mx:ViewStack selectedIndex="{m.currentState}" width="100%" height="100%">
<v:loginForm width="100%" height="100%"/>
<v:welcome width="100%" height="100%"/>
</mx:ViewStack>
</mx:Application>
=======================================================================
收获:
加深了对FrontController的理解
另外,对如何使用框架有了新的想法,
有这样一句话:
- the best solution is not when there is nothing left to add, but when there is nothing left to take away!
- 最好的解决方案不是无物可加,而是无物可减!
复制代码
[ 本帖最后由 iptton 于 2008-5-9 23:07 编辑 ] |
|