2009-04-16 68 views
7

所以我想要一種設置事件的方式,以便我可以傳遞數據而不會產生閉包\內存泄漏。這是據我已經得到:如何修改現有的AS3事件以便我可以傳遞數據?

package com.events { 
    import flash.events.Event; 

    public class CustomEvent extends Event { 
     public static const REMOVED_FROM_STAGE:String = "removedFromStage"; 
     public var data:*; 

     public function CustomEvent(type:String, customData:*=null, bubbles:Boolean=false, cancelable:Boolean=false) { 
      super(type, bubbles, cancelable); 
      this.data = customData; 
     } 

     public override function clone():Event { 
      return new CustomEvent(type, data, bubbles, cancelable); 
     } 

     public override function toString():String { 
      return formatToString("CustomEvent", "type", "data", "bubbles", "cancelable", "eventPhase"); 
     } 
    } 
} 

這讓我以下行爲:

function testme(e:Event) { 
    trace(e); 
} 

test_mc.addEventListener(CustomEvent.REMOVED_FROM_STAGE, testme); 
test_mc.dispatchEvent(new CustomEvent(CustomEvent.REMOVED_FROM_STAGE, 42)); 
//Traces [CustomEvent type="removedFromStage" data=42 bubbles=false cancelable=false eventPhase=2] 
removeChild(test_mc); 
//Traces [Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] 

我的目標是讓我想通過獲得從事件閃光燈通過自定義數據,而不僅僅是我開火的那個。例如,如果我想將一個movieclip和一個loader.COMPLETE事件一起傳遞給所產生的位圖,該怎麼辦?

回答

4

您將事件類擴展爲使用額外的數據進行分派,現在如果您希望Loader類派發您的自定義事件類型,請擴展Loader類來完成此操作(或者您想要執行此操作的任何其他類) 。在這個例子中,我會重寫的URLLoader使用這一功能(因爲裝載機實際調度事件從它的contentLoaderInfo,這需要兩個重載類的,我只是想保持簡單)


package com.net 
{ 
    import flash.net.URLLoader; 
    import flash.events.Event; 

    import com.events.CustomEvent; 

    public class CustomLoader extends URLLoader 
    { 
     // URLLoader already has a data property, so I used extraData 
     public var extraData:*; 

     override public function dispatchEvent(event: Event) : Boolean 
     { 
      var customEvent: CustomEvent = new CustomEvent(event.type, extraData, event.bubbles, event.cancelable); 
      return super.dispatchEvent(customEvent); 
     } 
    } 
} 

我們與您的自定義事件使用類嘗試此代碼在您的.fla


import com.net.CustomLoader; 
import com.events.CustomEvent; 

var loader: CustomLoader = new CustomLoader(); 
loader.extraData = "Extra Data"; 
loader.load(new URLRequest("test.xml")); 
loader.addEventListener(Event.COMPLETE, loadComplete); 

function loadComplete(event: CustomEvent) : void 
{ 
    trace(event.data); // Extra Data 
} 

BAM!您天生派發的活動的自定義數據!

+0

可否請您舉一個例子你的CustomEvent類 – 2010-02-04 20:34:00

+0

沒關係。 :) http://www.charglerode.com/blog/?p=51 – 2010-02-04 20:57:47

0

下面顯示了創建自定義事件的最簡潔方式。通常,事件類型具有在所有大寫字母中鍵入的公共靜態引用。事件分派時,它將事件或CustomEvent對象傳遞給事件處理程序方法。這是您可以檢索您傳遞的值的位置。

package com.hodgedev.events 
{ 
    import flash.events.Event; 

    public class CustomEvent extends Event 
    { 
     public static const VALUE_CHANGED:String = "VALUE_CHANGED"; 
     public var value:Number; 

     public function CustomEvent(pValue:Number) 
     { 
      super(CustomEvent.VALUE_CHANGED); 
      value = pValue; 
     } 
     public override function clone():Event 
     { 
      return new CustomEvent(value); 
     } 
    } 
} 

當我們派遣事件時,我們創建了一個新的事件實例來傳遞。

private var _someValue:int = 12; 
dispatchEvent(new CustomEvent(_somevalue)); 
相關問題