延續上章
在Command中我們有Proxy的操作
Proxy - 負責資料部份的操作,在MVC中是屬於Model的部份,管理Data Object
而操作的資料我們都是以Data Object (Value Object) 的方式來做儲存
在這次的範例中,我們是做時鐘所以實作了一個VO為ClockVO

ClockVO.as
package tw.ria.pureMVCclock.model.vo
{
public class ClockVO
{
[Bindable]
public var hour:Number;
public var minute:Number;
public var second:Number;
public var isRunning:Boolean;
public function ClockVO(h:Number, m:Number, s:Number, r:Boolean):void {
setTime(h,m,s,r);
}
public function setTime(h:Number, m:Number, s:Number, r:Boolean):void {
hour = h;
minute = m;
second = s;
isRunning = r;
}
public function toString():String{
return formatTime24();
}
private function formatTime24():String{
var timeString:String = "";
if(hour<10){
timeString +="0";
}
timeString += hour + ":";
if(minute<10){
timeString += "0";
}
timeString += minute + ":";
if(second<10){
timeString += "0";
}
timeString += second;
return timeString;
}
}
}
裡面包含了時間的格式,時分秒
另外開始建立操作VO的ClockProxy
我們在其中先實作setTime()跟驗證時間隔式的函式
//更新時間資料
public function setTime(h:Number,m:Number,s:Number):void{
var blChanged:Boolean=false;
if(h!=Clock.hour && isValidHour(h)==true){
Clock.hour = h;
blChanged = true;
}
if(m!=Clock.minute && isValidMinute(m)==true){
Clock.minute = m;
blChanged = true;
}
if(s!=Clock.second && isValidSecond(s)==true){
Clock.second = s;
blChanged = true;
}
//時間若有變動則發送Notification
if(blChanged == true){
notifyListeners();
}
}
//驗證時間格式
private function isValidHour(h:Number):Boolean{
return (Math.floor(h) == h && h>=0 && h<=23);
}
private function isValidMinute(m:Number):Boolean{
return (Math.floor(m) == m && m>=0 && m<=59);
}
private function isValidSecond(s:Number):Boolean{
return (Math.floor(s) == s && s>=0 && s<=59);
}
以及共用的Time Updates 發送Notification 的函式
//發送Notification
private function notifyListeners():void{
sendNotification(ApplicationFacade.CLOCK_TIME_UPDATED, Clock);
}
接著實作此ClockProxy的建構子
public function ClockProxy(proxyName:String=null, data:Object=null)
{
// 時,分,秒,isRunning
super(NAME, new ClockVO(0,0,0,false));
//建立Timer計時器,每秒一次呼叫timerHandler
timer = new Timer(1000, 0);
timer.addEventListener("timer", timerHandler);
//初始化時間為現在時間
var now:Date = new Date();
setTime(now.hours,now.minutes,now.seconds);
}
而 timerHandler 就是每秒一次Proxy變動VO資料的函式
//用來每秒更新時間
private function timerHandler(event:TimerEvent):void {
//取得現在資料中所存時間
var h:Number = Clock.hour;
var m:Number = Clock.minute;
var s:Number = Clock.second;
// 每秒+1,並更新其他分、時
s += 1;
if (s > 59) {
s = 0;
m += 1;
if (m > 59) {
m = 0;
h += 1;
if (h > 23) {
h = 0;
}
}
}
//更新時間資料
setTime(h, m, s);
}
因為一個Porxy控制一個VO,所以要取得Proxy控制VO的實體
通常都會使用getter用來把VO轉成他真正的型態
public function get Clock():ClockVO
{
return data as ClockVO;
}
其中的data為所繼承的母類別Proxy就已經宣告好了
最後就是讓Proxy提供start(),stop(),reset()讓其他地方呼叫
public function start():void{
if(!timer.running){
timer.start();
Clock.isRunning = true;
notifyListeners();
}
}
public function stop():void{
if(timer.running){
timer.stop();
Clock.isRunning = false;
notifyListeners();
}
}
public function reset():void{
if(timer.running){
timer.stop();
setTime(0,0,0);
timer.start();
}
else
{
setTime(0,0,0);
}
}
範例Demo
[kml_flashembed movie="http://eggant.appspot.com/swf/PureMVCClock01/Clock.swf" width="600" height="300"]
[/kml_flashembed]
View Source ...
.....



0 意見:
張貼意見