私は、データを渡すことができるようにどのように私は、既存のAS3イベントを変更しますか?
-
09-09-2019 - |
質問
だから、私はメモリリーク\クロージャを作成せずにデータを渡すことができるようにイベントを設定する方法をしたいです。これは、私の知る限りが持っているようです。
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]
私の目標は、私はイベントのフラッシュ火災、私は火のものではないだけに渡されるために渡したいカスタムデータを取得することです。例えば、私は結果のビットマップを置くためにloader.COMPLETEイベントと一緒にムービークリップを渡したい場合は何?
解決
それは余分なデータをディスパッチするために
あなたは、あなたのカスタムイベントタイプを派遣するLoaderクラスをしたい場合は、今、それを行うには、Loaderクラス(またはあなたがこれをしたい他のクラス)を拡張し、Eventクラスを拡張しました。この例では(それが2つのオーバーライドされたクラスが必要にcontentLoaderInfoを、だからLoaderは、実際にイベントを送出するので、私は単純な、それを維持したい)私は、この機能ではURLLoaderオーバーライドします。
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);
}
}
}
今すぐあなたの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!あなたの先天的に送出されたイベントにカスタムデータ!
他のヒント
以下は、カスタムイベントを作成するためのクリーンな方法を示しています。通常、イベントタイプはすべて首都文字で入力したパブリック静的参照を持っています。イベントが送出されると、それはイベントハンドラメソッドにイベント、または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));
所属していません StackOverflow