解析Flex事件機(jī)制中Flex事件分發(fā)和監(jiān)聽
在學(xué)習(xí)Flex的過程中,你可能會遇到Flex事件的概念,這里和大家分享一下,F(xiàn)lex事件可以看作是一種觸發(fā)機(jī)制,比如MouseEvent就是指的當(dāng)鼠標(biāo)進(jìn)行操作之后觸發(fā)的一系列的事件。
什么是Flex事件機(jī)制
Flex事件可以看作是一種觸發(fā)機(jī)制,當(dāng)滿足了一定的條件后,會觸發(fā)這個事件。比如MouseEvent就是指的當(dāng)鼠標(biāo)進(jìn)行操作之后觸發(fā)的一系列的事件。很多控件中都有click事件,這個事件就是一個MouseEvent的實例,當(dāng)點擊鼠標(biāo)后,系統(tǒng)會自動拋出一個名稱為click的MouseEvent事件(這種方法我們將在后面介紹到)。如果此時在click上注冊一個方法,那么觸發(fā)該事件時就會執(zhí)行這個方法。
1.Flex事件分發(fā)
最終繼承自EventDispatcher的對象都會含有dispatchEvent這個方法,他有一個參數(shù),事件對象。
之前說到的事件注冊通道,他只是一個通道,實際上事件是由這個方法來分發(fā)出去的,通道只是一個管道而已。
他的作用就是分發(fā)一個事件對象,他的分發(fā)是沒有目的的,一種廣播形式的,F(xiàn)lex的事件監(jiān)聽線程會接收到各種各樣的事件(我們稱之為捕獲事件,這在后面會介紹到),那么哪種才是你要的事件,標(biāo)識就通過事件的type屬性來區(qū)分。
1)Flex事件對象
在分發(fā)事件時,將會分發(fā)一個事件對象出去。不管是那個事件類,都是繼承自flash.events.Event對象的,他包含一些比較重要的屬性,type和bubbles。
type是事件的類型,事件監(jiān)聽通過這個參數(shù)來識別是否是自己所監(jiān)聽的事件。
bubbles是個布爾值,決定了該對象是否會向上傳遞。默認(rèn)是false。什么意思呢?畫個圖就明白了。
比如說,當(dāng)button組件分發(fā)click事件對象時,設(shè)置的bubbles為false,那么他的分發(fā)是這樣的
示意代碼
- dispatchEvent(newMouseEvent(“click”,false));
事件對象無法跨越組件本身,當(dāng)然,除了之前講到的注冊通道(這樣就很形象了吧)
因此,如果沒有注冊通道,在Flex主應(yīng)用中,就無法捕獲到這個button組件分發(fā)出的事件。
如果我們將Bubbles設(shè)為true,他看起來就是這樣
- dispatchEvent(newMouseEvent(“click”,true));
可以看到,這個事件可以跨過組件本身,到達(dá)Flex主應(yīng)用里。不止這樣,在幫助手冊中明確說到,如果在傳遞過程中間一直沒有被捕獲的話,這個事件會逐層上傳,直到最終的stage,那時如果還沒被捕獲,這個事件就會被銷毀掉。
這樣一來,即使我們沒有click的事件通道,只要我們在Flex主應(yīng)用中添加Flex事件監(jiān)聽器(addEventListener)那么我們就可以獲得到這個分發(fā)出的click事件了。
那么,注冊通道不是沒用了嗎?不是,之前說到過,注冊通道是現(xiàn)式的,可見的,因此如果你的組件要給其他人使用,那么就非常一目了然,而不必知道你源碼中究竟分發(fā)了什么事件。但是,不要監(jiān)聽和注冊同一個事件,這樣會重復(fù)執(zhí)行的。(后面將講到)
2.Flex事件監(jiān)聽
在分發(fā)中,我們講到,如果不是通過注冊通道來調(diào)用觸發(fā)事件,那么我們是需要一個監(jiān)聽來捕捉的。如何捕捉到分發(fā)出的事件,就是通過Flex事件的type值。
比如:
- <mx:Applicationxmlns:mxmx:Applicationxmlns:mx=http://www.adobe.com/2006/mxmllayout="absolute"xmlns:comp
- creationComplete='init()'
- >
- <mx:Script>
- <


















