samtiger


          QQ:418148757
          Name:yangchuan
          數據加載中……
          flex之彈出窗口數據傳遞

          彈出窗口:
          利用PopUpManager我們可以把flex容器組件作為一種彈出窗口,這樣也是便于我們將程序分塊編寫的方式之一。我們通常會自定義一個容器組件,作為彈出窗口的內容。
          舉一個例子來說明我們可能利用彈出窗口的地方。

          我們做用戶信息的增刪改查。第一步我們會做一個Module,用于布置datagrid組件和增刪查三個按鈕,那么在這個Module中我們的datagrid主要就是用于顯示查詢到的用戶數據列表。那么增加按鈕事件就是我們彈出一個窗口來編輯數據,完成后在該彈出窗口中點擊確定按鈕,數據將傳送給Module的一個函數。并由這個函數與后臺交互,最終使數據通過后臺添加到數據庫。那么這是彈出窗口向父窗體傳遞數據的例子,另外我們在Module的datagrid中雙擊選中的數據,也會彈出窗口,并將該條datagrid的這條記錄數據顯示在彈出窗口的相應輸入框中,供用戶編輯。當然這就是父窗體向彈出窗口傳遞數據的例子了。
          在flex中,我所知道的父子窗口傳遞數據有兩種,姑且先讓我這么命名并區分它們:一種是事件處理型,另一種就是函數綁定型。
          第一種方式(事件處理型):先看代碼,假設我們已經自定義好彈出窗體組件。那么看我們怎么在Module(也就是父窗體)中來調用彈出窗體的。
           1protected function button1_clickHandler(event:MouseEvent):void{
           2 //這里是新創建一個彈出窗體對象,UserWin為自定義的一個容器組件對象
           3         var win:UserWin = new UserWin(); 
           4    var user:TblBsUserType = new TblBsUserType();
           5//將user對象傳遞給彈出窗體,其中data為win里頭的一個空對象。在win里邊的代碼是public data:Object={};
           6    win.data.user = user;
           7//通過這種方法給win添加一個事件監聽器
           8    win.addEventListener("sendData",onSendData);
           9                PopUpManager.addPopUp(win,this,true); 
          10                PopUpManager.centerPopUp(win);
          11            }

          12
          13private function onSendData(e:Event):void{
          14                var user:UserType = e.currentTarget.data.user;
          15                Alert.show(ro.toString());
          16            }
          如上注釋,我們父窗體向子窗體傳遞數據的時候其實就是像子窗體的一個已存在的對象中動態添加數據屬性即可。這一點是ecmascript的規范,也是他的一個很好的優點。
          最后那個方法,其實就是我們處理彈出窗口傳數據給父窗體的一個處理過程,其實很簡單,為了解耦,我們一般不會在彈出窗口中做數據的處理過程,而是直接由彈出窗口傳回數據,交給父窗體處理。那么事件分發處理的方式,顯而易見就是我們在創建彈出窗體對象的時候,動態的給子窗體注冊一個事件監聽器,,然后彈出窗體的確定按鈕中調用dispatchEvent(new Event("sendData"));即可將數據傳回給父窗體中定義的那個事件處理函數去處理。其中e.currentTarget表示當前正在使用某個事件偵聽器處理 Event 對象的對象。也就是上邊的win對象。
          第二種函數綁定型,其實就是很簡單,我們知道在ecmascript中函數也是一種變量,那么就可以利用這一點將函數作為一個變量傳遞給彈出窗體,同樣可以達到我們處理的效果,
          代碼如下:
           1protected 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//結果處理函數
          13private function add(user:TblBsUserType):void{
          14                if(null != user.butyId && "" != user.butyId){
          15                    ro.addUser(user);
          16                }

          17            }

          那么在彈出窗體中我們只需要調用data.send(data.user);就可以了。

          備注:其實以上兩種方法,為了使用方便,其實都還可以優化的地方,比如,事件處理方式,我們還可以在自定義組件中聲明事件
          <fx:Metadata>
            [Event(name="sendData",type="flash.events.Event")]
           </fx:Metadata>
          讓使用組件的mxml文檔也能顯示注冊事件,如:<user:UserWin x="115" y="231" sendData=“sendDataHandler(event)”>
           </user:UserWin>

          另外,在函數處理方式上,我們是利用函數綁定到對象的方式,來處理數據的,其實,為了使用接口的人更明確一些,我們可以把這個函數預先定義為組件的屬性,比如:[Bindale]public var sendData:Function;這樣在創建組件對象的地方,就可以明確的把用戶自定義的處理函數賦值給這個屬性(sendData)。
          總之:不管怎么樣,事件處理和函數處理都可以完成我們的要求,任選其一即可。



          posted on 2010-04-10 17:07 sam.chuan.yang 閱讀(6688) 評論(7)  編輯  收藏 所屬分類: flex基礎

          評論

          # re: flex之彈出窗口數據傳遞[未登錄] 2012-03-15 10:29 aaaa

          aaa
            回復  更多評論    

          # re: flex之彈出窗口數據傳遞 2013-04-25 20:40 iui

          4444444
            回復  更多評論    

          # re: flex之彈出窗口數據傳遞 2013-06-07 09:12 小學

          倒薩
            回復  更多評論    

          # re: flex之彈出窗口數據傳遞 2013-06-07 21:45 

          電飯鍋電飯鍋
            回復  更多評論    

          # re: flex之彈出窗口數據傳遞 2013-07-05 12:56 fdsa

          fdas
            回復  更多評論    

          # re: flex之彈出窗口數據傳遞 2013-08-30 09:06 

          @aaaa
          撒旦法都是
            回復  更多評論    

          # re: flex之彈出窗口數據傳遞[未登錄] 2015-06-25 14:31 123123

          123123
            回復  更多評論    
          主站蜘蛛池模板: 平阴县| 万源市| 彰化市| 潞城市| 连平县| 翁牛特旗| 句容市| 汕头市| 桃江县| 大足县| 岗巴县| 昭觉县| 南丰县| 盘锦市| 汪清县| 碌曲县| 高唐县| 山西省| 万山特区| 同江市| 洛南县| 霍州市| 雅安市| 平谷区| 全椒县| 武胜县| 阿图什市| 余江县| 宜州市| 曲松县| 开远市| 攀枝花市| 达日县| 镇安县| 宁明县| 佛冈县| 莱西市| 乌苏市| 白朗县| 宜阳县| 新昌县|