簡單概略的介紹一下 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月30日 星期五
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 怎麼那麼困難阿
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)
(待續)
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:看书要仔细,看高手的代码一定要学习透彻,而不是拿来主义,或者是模仿主义!
寫得挺棒的耶 ~ 不過我要在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:看书要仔细,看高手的代码一定要学习透彻,而不是拿来主义,或者是模仿主义!
訂閱:
文章 (Atom)