您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)Flex事件機(jī)制中Flex事件分發(fā)和監(jiān)聽(tīng)的示例分析的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
什么是Flex事件機(jī)制
Flex事件可以看作是一種觸發(fā)機(jī)制,當(dāng)滿足了一定的條件后,會(huì)觸發(fā)這個(gè)事件。比如MouseEvent就是指的當(dāng)鼠標(biāo)進(jìn)行操作之后觸發(fā)的一系列的事件。很多控件中都有click事件,這個(gè)事件就是一個(gè)MouseEvent的實(shí)例,當(dāng)點(diǎn)擊鼠標(biāo)后,系統(tǒng)會(huì)自動(dòng)拋出一個(gè)名稱為click的MouseEvent事件(這種方法我們將在后面介紹到)。如果此時(shí)在click上注冊(cè)一個(gè)方法,那么觸發(fā)該事件時(shí)就會(huì)執(zhí)行這個(gè)方法。
1.Flex事件分發(fā)
最終繼承自EventDispatcher的對(duì)象都會(huì)含有dispatchEvent這個(gè)方法,他有一個(gè)參數(shù),事件對(duì)象。
之前說(shuō)到的事件注冊(cè)通道,他只是一個(gè)通道,實(shí)際上事件是由這個(gè)方法來(lái)分發(fā)出去的,通道只是一個(gè)管道而已。
他的作用就是分發(fā)一個(gè)事件對(duì)象,他的分發(fā)是沒(méi)有目的的,一種廣播形式的,F(xiàn)lex的事件監(jiān)聽(tīng)線程會(huì)接收到各種各樣的事件(我們稱之為捕獲事件,這在后面會(huì)介紹到),那么哪種才是你要的事件,標(biāo)識(shí)就通過(guò)事件的type屬性來(lái)區(qū)分。
1)Flex事件對(duì)象
在分發(fā)事件時(shí),將會(huì)分發(fā)一個(gè)事件對(duì)象出去。不管是那個(gè)事件類,都是繼承自flash.events.Event對(duì)象的,他包含一些比較重要的屬性,type和bubbles。
type是事件的類型,事件監(jiān)聽(tīng)通過(guò)這個(gè)參數(shù)來(lái)識(shí)別是否是自己所監(jiān)聽(tīng)的事件。
bubbles是個(gè)布爾值,決定了該對(duì)象是否會(huì)向上傳遞。默認(rèn)是false。什么意思呢?畫個(gè)圖就明白了。
比如說(shuō),當(dāng)button組件分發(fā)click事件對(duì)象時(shí),設(shè)置的bubbles為false,那么他的分發(fā)是這樣的
示意代碼
dispatchEvent(newMouseEvent(“click”,false));
事件對(duì)象無(wú)法跨越組件本身,當(dāng)然,除了之前講到的注冊(cè)通道(這樣就很形象了吧)
因此,如果沒(méi)有注冊(cè)通道,在Flex主應(yīng)用中,就無(wú)法捕獲到這個(gè)button組件分發(fā)出的事件。
如果我們將Bubbles設(shè)為true,他看起來(lái)就是這樣
dispatchEvent(newMouseEvent(“click”,true));
可以看到,這個(gè)事件可以跨過(guò)組件本身,到達(dá)Flex主應(yīng)用里。不止這樣,在幫助手冊(cè)中明確說(shuō)到,如果在傳遞過(guò)程中間一直沒(méi)有被捕獲的話,這個(gè)事件會(huì)逐層上傳,直到最終的stage,那時(shí)如果還沒(méi)被捕獲,這個(gè)事件就會(huì)被銷毀掉。
這樣一來(lái),即使我們沒(méi)有click的事件通道,只要我們?cè)贔lex主應(yīng)用中添加Flex事件監(jiān)聽(tīng)器(addEventListener)那么我們就可以獲得到這個(gè)分發(fā)出的click事件了。
那么,注冊(cè)通道不是沒(méi)用了嗎?不是,之前說(shuō)到過(guò),注冊(cè)通道是現(xiàn)式的,可見(jiàn)的,因此如果你的組件要給其他人使用,那么就非常一目了然,而不必知道你源碼中究竟分發(fā)了什么事件。但是,不要監(jiān)聽(tīng)和注冊(cè)同一個(gè)事件,這樣會(huì)重復(fù)執(zhí)行的。(后面將講到)
2.Flex事件監(jiān)聽(tīng)
在分發(fā)中,我們講到,如果不是通過(guò)注冊(cè)通道來(lái)調(diào)用觸發(fā)事件,那么我們是需要一個(gè)監(jiān)聽(tīng)來(lái)捕捉的。如何捕捉到分發(fā)出的事件,就是通過(guò)Flex事件的type值。
比如:
<mx:Applicationxmlns:mxmx:Applicationxmlns:mx=http://www.adobe.com/2006/mxmllayout="absolute"xmlns:comp creationComplete='init()' > <mx:Script> <![CDATA[ privatefunctioninit(){ testBtn.addEventListener(“click”,clickHandler); }
Flex的事件中都提供了一些靜態(tài)常量,讓我們調(diào)用,避免我們打錯(cuò)了。因此這句話可以這么寫
testBtn.addEventListener(MouseEvent.CLICK,clickHandler);
我們看到,監(jiān)聽(tīng)的回調(diào)方法中沒(méi)有傳遞參數(shù),是的,這和通道的寫法有些不同,這里的回調(diào)方法(即clickHandler)只是個(gè)引用,并不是代表方法的執(zhí)行,他的含義是,告訴eventLinstener,如果捕捉到click事件,那么就去找clickHandler,并執(zhí)行它,event對(duì)象參數(shù)在執(zhí)行時(shí)動(dòng)態(tài)的傳遞。(如果熟悉ajax的朋友這里應(yīng)該很容易懂了)
他作用起來(lái)就是這樣,如果你又注冊(cè)了click的事件通道,那么這兩個(gè)都會(huì)生效,顯然這是多余的。
3.關(guān)于異步和執(zhí)行順序
以前的說(shuō)法有誤,as里是不存在線程概念的,在遠(yuǎn)程請(qǐng)求時(shí),結(jié)果事件、錯(cuò)誤事件都是異步的。如果你需要處理結(jié)果,需要利用監(jiān)聽(tīng),并在回調(diào)中獲取你的遠(yuǎn)程數(shù)據(jù)。
而在處理本地事件時(shí),他們?nèi)匀皇峭降摹?/p>
回調(diào)方法執(zhí)行的順序甚至還不如dispatchEvent之后的方法。如果接下來(lái)的方法依賴于Flex事件回調(diào),那么把接下來(lái)的方法寫到回調(diào)方法中去。
感謝各位的閱讀!關(guān)于“Flex事件機(jī)制中Flex事件分發(fā)和監(jiān)聽(tīng)的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。