天天看點

Flex中利用事件機制進行主程式與子窗體間參數傳遞

在開發具有子窗體,或者itemrenderer的應用時,常常涉及到子窗體向父窗體傳遞參數或者從itemrenderer内的控件向外部的主程式傳遞參數的需求。這些都可以通過事件機制這一統一方法加以解決。

在我的應用中有兩個需求:

1、左側的list控件的itemrenderer中包含checkbox控件,當其狀态改變時需要同時改變主程式中的一個數組變量的内容;

2、左下方的“新增屆次”按鈕會彈出一個視窗,視窗中輸入屆次資訊後需要修改資料庫中的表,同時表的更改結果要能夠在list控件中展現出來。

這兩個需求我都通過事件機制來解決,具體方法如下:

第一個需求:

1、首先建立一個事件類:

package com.renda.event{

    import

flash.events.event;

    public class listitemchangeevent

extends event{

        public var

jieci:object;//用來傳遞參數的類屬性

        public

function listitemchangeevent(type:string,

jieci:object=null,

                              bubbles:boolean=false,

cancelable:boolean=false)

{

            this.jieci=jieci;

            super(type,

bubbles,

cancelable);

        }

    }

}

2、list控件的代碼如下:

            <mx:list

id="jiecilist" bottom="42" top="38" left="10" right="0"

dataprovider="{jiecilistac}"

labelfunction="listlabelfunction">

                <mx:itemrenderer>

                    <mx:component>

                        <mx:checkbox

change="onchange(event)">

                        <mx:script>

                            <![cdata[

                                import

com.renda.event.listitemchangeevent;

                                private

function onchange(evt:event):void

                                    var

jieciobj:object=new

object

                                    jieciobj.jie=data.jie

                                    jieciobj.ci=data.ci

                                    //觸發自定義事件,因為事件處理程式在主窗體中,是以evt的第三個參數即bubbles設定為true,表示冒泡到主程式層

evtchange:listitemchangeevent=new

listitemchangeevent("list_item_changed",jieciobj,true);

                                    this.dispatchevent(evtchange);

                                }

                            ]]>

                        </mx:script>

                        </mx:checkbox>

                    </mx:component>

                </mx:itemrenderer>

            </mx:list>

3、主程式的初始化函數中定義時間偵聽器:

private function

init():void{

       jiecilist.addeventlistener("list_item_changed",listitemchangehandler);   

       }

4、主程式中定義事件處理函數:

private function listitemchangehandler(evt:listitemchangeevent):void

       //需要執行的代碼放在這裡

對于第二個需求,也是同樣的原理,隻不過主程式中偵聽器的定義不是在程式初始化時,而是彈出視窗建立時,在子視窗關閉時觸發事件,在主程式中偵聽事件并作相應操作:

1、定義事件類:

package

com.renda.event{

    //子窗體關閉事件

    public

class windowcloseevent extends

event{

         public

function windowcloseevent(type:string, bubbles:boolean=false,

cancelable:boolean=false){

           super(type,

           }

2、子窗體中在關閉子窗體之前觸發事件:

var evtclose:windowcloseevent=new

windowcloseevent("sub_window_closed");

this.dispatchevent(evtclose);

popupmanager.removepopup(this)//關閉子窗體

3、主程式中定義事件偵聽器:

newjiecibtnclickhandler(evt:mouseevent):void{//彈出子窗按鈕

   var

popnewjieci:

newjieciwin=newjieciwin(popupmanager.createpopup(this,newjieciwin,true));

   //彈出對話框居中

   popupmanager.centerpopup(popnewjieci);

   //定義事件偵聽器

   popnewjieci.addeventlistener("sub_window_closed",newjieciwinclosehandler);

   }

4、主程式中的事件處理函數:

private

function

newjieciwinclosehandler(evt:windowcloseevent):void{

     //需要執行的代碼放在這裡

     }

轉載自: http://blog.sina.com.cn/s/blog_4d65c19e0100gwuv.html