2011年9月30日 星期五

PureMVC 解析

簡單概略的介紹一下 PureMVC

M = Model
V = View
C = Controller

這個framework 用了五個Design pattern (facade , command , proxy , singleton , observer
當初為什麼要用這個framework的原因 ?
1.架構吸引人
2.分工方便

不想用的原因是
1.code 會寫的很冗長
2.並不是每個人都可以理解這錮中含意
3.Unit test 不方便

1.Mediator 跟 ViewComponent(VC)
在使用上
Mediator 就是在控制view的一個view controller
但Mediator 是可以監聽command和發送command的喔
可以從Mediator裡面看到他提供這兩個關鍵方法: listNotificationInterests() 和handleNotification()

實作上

在new的時候 就是要做到提供一個字串名稱和VC 做這個mediator 的註冊
以便facade可以看到這個mediator並對她做取用和塞值


//============再補充 ===================



2011年9月29日 星期四

SharedEvents 使用方式

在ApplicationDomain異域裡面
base.swf 載入子child.swf
兩者要達到溝通的方式 :
(1). LocalConnection
(2). SharedEvent
============================================================================
第一種方式
因為上一次專案 有過慘痛的例子
就是在傳送大量訊息的時候 會有可以中斷connecting 必須要做reconnecting
所以就不考慮這個方式了
第二種方式
來自於一個大師推薦的 不過也算經過一個穩定的測試 (至少比LocadConnection來的穩定多了

============================================================================
在 AS3 LoaderInfo.sharedEvents 可以在不開放 Cross-Domain Scripting 限制下
互相發送事件,算是解決我們的一些複雜的問題了.

step 1.
我們一定會做載入swf 的
var  loader :Loader = new  Loader () ;
var  context : LoaderContext = new  LoaderContext () ;
/* 加載到新域(獨立運行)*/
context . applicationDomain = new  ApplicationDomain () ;
loader . load ( new  URLRequest ( " Child.swf " ) , context ) ;              loader.contentLoaderInfo.addEventListener(Event.COMPLETE,completeHandler);


(待續 ) 乾 寫個sample code 怎麼那麼困難阿

ApplicationDomain 四種情況詳述

LoaderContext
1.(父子) loader的applicationDomain 是子swf的ApplicationDomain的父
context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain)
2.(同域)子swf使用和父swf相同的applicationDomain
context.applicationDomain = ApplicationDomain.currentDomain
3.(異域)system domain 作為子swf的父域
context.applicationDomain = new ApplicationDomain()
4.(異域)
context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain.parentDomain.parentDomain)

(待續)

2011年9月26日 星期一

關於event 事件的 clone()

網路上找到相關的資料
寫得挺棒的耶 ~ 不過我要在try一下

TypeError: Error #1034: 强制转换类型失败:无法将 flash.events::Event 转换为 MyEvent。
同样这也是一个运行错误,我们来看看是一段什么样的代码导致他报错的
大家也先找找他的错在哪

首先先看一下这个MyEvent类

package
{
import flash.events.Event;
public class MyEvent extends Event
{
public static const MY:String = "my";

public function MyEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
}

}
}

然后侦听这个事件,在得到它后转发到spr对象中

addEventListener(MyEvent.MY,myHandle);
private function myHandle(e:MyEvent):void{
spr.dispatchEvent(e);
}
再就是,spr对象中侦听了这个事件

spr.addEventListener(MyEvent.MY,myHandle);
private function myHandle(e:MyEvent):void{
trace(e);
}
最后在这个侦听的地方就报错了。

在殿堂之路中,继承Event自定义事件举例中讲过这种问题的解决办法,但没有讲的很详细
很多新手在看高手的代码,都会看到自定义事件中都会重构clone这个方法,但是自己尝试后发现,不重构clone也不会出现什么问题,以至于有些人在写项目赶时间时,也不太喜欢100%模仿高手的写法,就会把重构clone这个看似很小,其实隐藏了秘密的东西给忽略掉。
在殿堂之路中有句原话:

以下摘抄《殿堂之路》第300页原话
其中clone()方法最为重要,使用clone()方法可以返回当前事件对象的一个拷贝。这个clone()方法一般不需要我们手工调用,当我们将一个事件对象重复发送时,EventDispatcher类会自动调用clone()方法,产生这个事件的拷贝。
而上面的代码中就是在将MyEvent事件重复发送,好理解的说就是转发MyEvent事件,如果没有重构MyEvent事件,那么EventDispatcher在重复发送时,调用的clone是Event的clone方法,那么clone出来的事件自然就是Event类,而不是MyEvent,所以你在侦听时使用e:MyEvent类型接收时,自然就会报错无法将Event类转换成MyEvent类。
总结2:看书要仔细,看高手的代码一定要学习透彻,而不是拿来主义,或者是模仿主义!