自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Flex事件機制用法揭秘

開發(fā) 后端
本文向大家介紹一下Flex事件機制的概念,很多新人對Flex事件機制都不太熟悉,為了更快更好的幫助大家,將介紹一下Flex中事件的各種機制和用法。

在學(xué)習(xí)Flex的過程中難免會遇到Flex事件機制方面的問題,這里和大家分享一下,F(xiàn)lex的精髓之一就是事件和綁定機制,了解之后,能幫助大家更靈活的設(shè)計程序,也對新手上路有一定的幫助。

Flex事件機制

一.引言

很多新人對Flex事件機制都不太熟悉,在使用過程中難免會出現(xiàn)各種問題,這是一個非常普遍的問題,為了更快更好的幫助大家,將介紹一下Flex中事件的各種機制和用法。

Flex的精髓之一就是事件和綁定機制,了解之后,能幫助大家更靈活的設(shè)計程序,也對新手上路有一定的幫助。

講解可能不太系統(tǒng),也不全面,有很多沒有深入。如果高手看到后有疑問,歡迎指正。當(dāng)然各位也可以提出自己的看法,或者經(jīng)驗分享,謝謝。

二.Flex事件機制介紹

1.什么是Flex事件機制

事件可以看作是一種觸發(fā)機制,當(dāng)滿足了一定的條件后,會觸發(fā)這個事件。比如MouseEvent就是指的當(dāng)鼠標(biāo)進(jìn)行操作之后觸發(fā)的一系列的事件。很多控件中都有click事件,這個事件就是一個MouseEvent的實例,當(dāng)點擊鼠標(biāo)后,系統(tǒng)會自動拋出一個名稱為click的MouseEvent事件(這種方法我們將在后面介紹到)。如果此時在click上注冊一個方法,那么觸發(fā)該事件時就會執(zhí)行這個方法。

Flex主應(yīng)用的mxml代碼

  1. <mx:Script> 
  2. <![CDATA[  
  3. importmx.controls.Alert;  
  4. privatefunctionclickHandler(e:MouseEvent){  
  5. Alert.show(e.currentTarget.toString());  
  6. }  
  7. ]]> 
  8. </mx:Script> 
  9. <mx:Buttonidmx:Buttonid="testBtn"click="clickHandler(event)"label="測試"> 
  10. </mx:Button> 

在我們寫代碼時,編輯器的代碼補全提示列表中,有很多不同的圖標(biāo)。

那些帶有閃電的就是事件,三個小塊的就是樣式,空心圓圈的是屬性,實心圓點的是公有方法,還有一個是效果。

我們能在這個列表中看到的事件,我把它稱之為事件注冊通道。(官方仍然稱它為事件,但是它又和普通的事件含義不同。關(guān)于事件注冊通道會再下面講述到)

2.事件注冊通道

上面Flex事件機制說到了這些通道是只能在mxml的代碼提示中可以看到的,他的作用就是給mxml組件提供事件觸發(fā)時所執(zhí)行的方法的注冊通道,而且能在代碼提示中可見,這樣給組件提供了很大的抽象的好處,我們可以很清楚的告訴組件的使用者,組件里包含哪些事件給你調(diào)用。
為什么把他區(qū)別對待?除了代碼提示外,他還有一些實現(xiàn)上的不同。

Button的click事件是繼承自核心類InteractiveObject,遺憾我們看不到他的源碼,但是說明了“事件注冊通道”是可以繼承的。

我們會在自定義事件中講述到如何聲明“事件注冊通道”。

3.事件觸發(fā)方法

注冊通道中如果填入了函數(shù),那么就代表觸發(fā)該事件時,會執(zhí)行這個方法。

  1. click="clickHandler(event)" 

我們看到這個方法有一個event對象作為參數(shù)傳入,新人可能會問到,這個event對象哪里來的?我也沒聲明這個變量啊。他實際上是注冊通道傳給他的,默認(rèn)變量名就是event。我們?nèi)绻朐谑录|發(fā)時傳其他的參數(shù),可以通過自定的事件對象來實現(xiàn)。

這個對象就是這個組件分發(fā)的事件對象,即type為“click”的MouseEvent的一個實例。

這個event對象包含了觸發(fā)該事件時的各種信息,比如觸發(fā)事件對象是哪個,監(jiān)聽對象是哪個,觸發(fā)時鼠標(biāo)點在哪里等等,不同的event類會包含不同的屬性,比如KeyboardEvent包含了鍵盤點擊了哪個鍵。

我們也可以通過自定義一個事件類,來傳遞我們自己想要的各種信息。(這在后面將介紹到)

4.事件分發(fā)

Flex事件機制最終繼承自EventDispatcher的對象都會含有dispatchEvent這個方法,他有一個參數(shù),事件對象。
之前說到的事件注冊通道,他只是一個通道,實際上事件是由這個方法來分發(fā)出去的,通道只是一個管道而已。

他的作用就是分發(fā)一個事件對象,他的分發(fā)是沒有目的的,一種廣播形式的,F(xiàn)lex的事件監(jiān)聽線程會接收到各種各樣的事件(我們稱之為捕獲事件,這在后面會介紹到),那么哪種才是你要的事件,標(biāo)識就通過事件的type屬性來區(qū)分。

1)事件對象

在分發(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ā)是這樣的

示意代碼
 

  1. dispatchEvent(newMouseEvent(“click”,false)); 

事件對象無法跨越組件本身,當(dāng)然,除了之前講到的注冊通道(這樣就很形象了吧)
因此,如果沒有注冊通道,在Flex主應(yīng)用中,就無法捕獲到這個button組件分發(fā)出的事件。

如果我們將Bubbles設(shè)為true,他看起來就是這樣
 

  1. dispatchEvent(newMouseEvent(“click”,true)); 

可以看到,這個事件可以跨過組件本身,到達(dá)Flex主應(yīng)用里。不止這樣,在幫助手冊中明確說到,如果在傳遞過程中間一直沒有被捕獲的話,這個事件會逐層上傳,直到最終的stage,那時如果還沒被捕獲,這個事件就會被銷毀掉。

這樣一來,即使我們沒有click的事件通道,只要我們在Flex主應(yīng)用中添加事件監(jiān)聽器(addEventListener)那么我們就可以獲得到這個分發(fā)出的click事件了。
那么,注冊通道不是沒用了嗎?不是,之前說到過,注冊通道是現(xiàn)式的,可見的,因此如果你的組件要給其他人使用,那么就非常一目了然,而不必知道你源碼中究竟分發(fā)了什么事件。但是,不要監(jiān)聽和注冊同一個事件,這樣會重復(fù)執(zhí)行的。(后面將講到)

5.Flex事件機制中事件監(jiān)聽

在分發(fā)中,我們講到,如果不是通過注冊通道來調(diào)用觸發(fā)事件,那么我們是需要一個監(jiān)聽來捕捉的。如何捕捉到分發(fā)出的事件,就是通過事件的type值。

比如:
 

  1. <mx:Applicationxmlns:mxmx:Applicationxmlns:mx=http://www.adobe.com/2006/mxmllayout="absolute"xmlns:comp  
  2. creationComplete='init()' 
  3. > 
  4. <mx:Script> 
  5. <![CDATA[  
  6. privatefunctioninit(){  
  7. testBtn.addEventListener(“click”,clickHandler);  

Flex事件機制中Flex的事件中都提供了一些靜態(tài)常量,讓我們調(diào)用,避免我們打錯了。因此這句話可以這么寫

  1. testBtn.addEventListener(MouseEvent.CLICK,clickHandler); 

我們看到,監(jiān)聽的回調(diào)方法中沒有傳遞參數(shù),是的,這和通道的寫法有些不同,這里的回調(diào)方法(即clickHandler)只是個引用,并不是代表方法的執(zhí)行,他的含義是,告訴eventLinstener,如果捕捉到click事件,那么就去找clickHandler,并執(zhí)行它,event對象參數(shù)在執(zhí)行時動態(tài)的傳遞。(如果熟悉ajax的朋友這里應(yīng)該很容易懂了)

他作用起來就是這樣

如果你又注冊了click的事件通道,那么這兩個都會生效,顯然這是多余的。

6.關(guān)于異步和執(zhí)行順序

以前的說法有誤,as里是不存在線程概念的,在遠(yuǎn)程請求時,結(jié)果事件、錯誤事件都是異步的。如果你需要處理結(jié)果,需要利用監(jiān)聽,并在回調(diào)中獲取你的遠(yuǎn)程數(shù)據(jù)。
而在處理本地事件時,他們?nèi)匀皇峭降摹?/p>

回調(diào)方法執(zhí)行的順序甚至還不如dispatchEvent之后的方法。如果接下來的方法依賴于事件回調(diào),那么把接下來的方法寫到回調(diào)方法中去。

【編輯推薦】

  1. 解析Flex事件機制的三個階段
  2. FlexBuilder4十大新特性閃亮登場
  3. Flex框架中Cairngorm和Mate的優(yōu)點大比拼
  4. FlexBuilder3.0與Eclipse3.4的***結(jié)合
  5. 解析Flex應(yīng)用開發(fā)步驟 新特性和技術(shù)框架 
責(zé)任編輯:佚名 來源: accptech.com
相關(guān)推薦

2010-08-06 10:15:35

Flex綁定

2010-08-04 14:07:59

Flex事件機制

2010-08-04 13:52:53

Flex事件機制

2010-08-12 15:35:44

Flex事件機制

2010-08-06 10:03:42

Flex事件

2010-07-29 10:33:59

Flex鍵盤事件

2010-08-13 13:56:02

Flex事件機制

2010-08-13 11:21:31

Flex渲染器

2010-08-06 09:56:06

Flex事件機制

2010-08-13 11:34:54

Flex自定義事件

2010-08-04 14:02:08

Flex事件機制

2010-08-09 11:06:01

Flex事件機制

2010-08-09 15:09:27

Flex數(shù)據(jù)訪問

2010-08-12 13:59:37

FlexList控件

2010-08-13 14:05:24

Flex事件機制

2010-08-06 10:24:56

Flex事件分發(fā)

2010-08-09 09:47:34

Flex事件機制

2010-08-09 10:34:05

Flex背景

2010-07-27 10:54:22

Flex

2010-08-13 09:47:58

Flex樣式定義
點贊
收藏

51CTO技術(shù)棧公眾號