Pages

Subscribe

2010年5月9日

[PureMVC]初學者入門教學Part.4 Proxy and 範例Demo

延續上章

在Command中我們有Proxy的操作

Proxy - 負責資料部份的操作,在MVC中是屬於Model的部份,管理Data Object

而操作的資料我們都是以Data Object (Value Object) 的方式來做儲存

在這次的範例中,我們是做時鐘所以實作了一個VO為ClockVO

00.jpg

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"]





Get Adobe Flash player





[/kml_flashembed]
View Source ...

.....

0 意見:

張貼意見

Related Posts Plugin for WordPress, Blogger...