flex之彈出窗口數(shù)據(jù)傳遞
彈出窗口:
利用PopUpManager我們可以把flex容器組件作為一種彈出窗口,這樣也是便于我們將程序分塊編寫的方式之一。我們通常會(huì)自定義一個(gè)容器組件,作為彈出窗口的內(nèi)容。
舉一個(gè)例子來說明我們可能利用彈出窗口的地方。
在flex中,我所知道的父子窗口傳遞數(shù)據(jù)有兩種,姑且先讓我這么命名并區(qū)分它們:一種是事件處理型,另一種就是函數(shù)綁定型。
第一種方式(事件處理型):先看代碼,假設(shè)我們已經(jīng)自定義好彈出窗體組件。那么看我們怎么在Module(也就是父窗體)中來調(diào)用彈出窗體的。
1
protected function button1_clickHandler(event:MouseEvent):void{
2
//這里是新創(chuàng)建一個(gè)彈出窗體對(duì)象,UserWin為自定義的一個(gè)容器組件對(duì)象
3
var win:UserWin = new UserWin();
4
var user:TblBsUserType = new TblBsUserType();
5
//將user對(duì)象傳遞給彈出窗體,其中data為win里頭的一個(gè)空對(duì)象。在win里邊的代碼是public data:Object={};
6
win.data.user = user;
7
//通過這種方法給win添加一個(gè)事件監(jiān)聽器
8
win.addEventListener("sendData",onSendData);
9
PopUpManager.addPopUp(win,this,true);
10
PopUpManager.centerPopUp(win);
11
}
12
13
private function onSendData(e:Event):void{
14
var user:UserType = e.currentTarget.data.user;
15
Alert.show(ro.toString());
16
}
如上注釋,我們父窗體向子窗體傳遞數(shù)據(jù)的時(shí)候其實(shí)就是像子窗體的一個(gè)已存在的對(duì)象中動(dòng)態(tài)添加數(shù)據(jù)屬性即可。這一點(diǎn)是ecmascript的規(guī)范,也是他的一個(gè)很好的優(yōu)點(diǎn)。
2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

最后那個(gè)方法,其實(shí)就是我們處理彈出窗口傳數(shù)據(jù)給父窗體的一個(gè)處理過程,其實(shí)很簡單,為了解耦,我們一般不會(huì)在彈出窗口中做數(shù)據(jù)的處理過程,而是直接由彈出窗口傳回?cái)?shù)據(jù),交給父窗體處理。那么事件分發(fā)處理的方式,顯而易見就是我們在創(chuàng)建彈出窗體對(duì)象的時(shí)候,動(dòng)態(tài)的給子窗體注冊一個(gè)事件監(jiān)聽器,,然后彈出窗體的確定按鈕中調(diào)用dispatchEvent(new Event("sendData"));即可將數(shù)據(jù)傳回給父窗體中定義的那個(gè)事件處理函數(shù)去處理。其中e.currentTarget表示當(dāng)前正在使用某個(gè)事件偵聽器處理 Event 對(duì)象的對(duì)象。也就是上邊的win對(duì)象。
第二種函數(shù)綁定型,其實(shí)就是很簡單,我們知道在ecmascript中函數(shù)也是一種變量,那么就可以利用這一點(diǎn)將函數(shù)作為一個(gè)變量傳遞給彈出窗體,同樣可以達(dá)到我們處理的效果,
代碼如下:
1
protected function button1_clickHandler(event:MouseEvent):void
2
{
3
var win:UserWin = new UserWin();
4
var user:TblBsUserType = new TblBsUserType();
5
win.data.user = user;
6
win.data.send = add;
7
//win.addEventListener("sendData",onSendData);
8
PopUpManager.addPopUp(win,this,true);
9
PopUpManager.centerPopUp(win);
10
}
11
12
//結(jié)果處理函數(shù)
13
private function add(user:TblBsUserType):void{
14
if(null != user.butyId && "" != user.butyId){
15
ro.addUser(user);
16
}
17
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

那么在彈出窗體中我們只需要調(diào)用data.send(data.user);就可以了。
備注:其實(shí)以上兩種方法,為了使用方便,其實(shí)都還可以優(yōu)化的地方,比如,事件處理方式,我們還可以在自定義組件中聲明事件
<fx:Metadata>
[Event(name="sendData",type="flash.events.Event")]
</fx:Metadata>
讓使用組件的mxml文檔也能顯示注冊事件,如:<user:UserWin x="115" y="231" sendData=“sendDataHandler(event)”>
</user:UserWin>
另外,在函數(shù)處理方式上,我們是利用函數(shù)綁定到對(duì)象的方式,來處理數(shù)據(jù)的,其實(shí),為了使用接口的人更明確一些,我們可以把這個(gè)函數(shù)預(yù)先定義為組件的屬性,比如:[Bindale]public var sendData:Function;這樣在創(chuàng)建組件對(duì)象的地方,就可以明確的把用戶自定義的處理函數(shù)賦值給這個(gè)屬性(sendData)。
總之:不管怎么樣,事件處理和函數(shù)處理都可以完成我們的要求,任選其一即可。
posted on 2010-04-10 17:07 sam.chuan.yang 閱讀(6688) 評(píng)論(7) 編輯 收藏 所屬分類: flex基礎(chǔ)