1

イベントと一緒に渡す必要のあるパラメーターがあります。クラスを拡張して型に配置しようとして失敗した後、別のSOの質問で、カスタムイベントを作成するようにアドバイスされました。

Event.COMPLETE以前にこれを試しましたが、FileReferenceの通常のイベントで別のパラメーターを送信したいだけなので、送信方法がわかりませんでした。同じボートに乗ることになるため、発砲してからイベントをディスパッチすることはできませんEvent.COMPLETE...必要なパラメーターが最初のEvent.COMPLETEオブジェクトに含まれないため、そのパラメーターを渡す新しいイベントをディスパッチできません実際に作業を実行するコードに移ります。

これに関するすべての助けは大いに感謝されます、それをひどく必要とします。ありがとう。

基本的に、Event.COMPLETE機能をそのまま置き換える必要があります。必要なのは、追加のプロパティを保持するイベントだけです。これを行う方法があることを教えてください。

4

6 に答える 6

9

最初に、イベント リスナーを通常どおりに追加する必要があります。イベント リスナーEvent.COMPLETEは自動的にディスパッチされ、それに対してできることは何もないためです。そのイベント ハンドラー内で、アプリケーションの残りの部分がカスタム プロパティをアタッチしてリッスンしている場合でも、独自のカスタムをディスパッチできます。簡単な例を次に示します。

イベント処理コードは次のようになります。

yourObject.addEventListener(Event.COMPLETE, function(event:Event):void{

  var myEvt:MyEvent = new MyEvent(MyEvent.COMPLETE, myCustomProperty);
  dispatchEvent( myEvt );

})

MyEventクラスは次のようになります。

package
{

  import flash.events.Event;

  public class MyEvent extends Event
  {

    public static const COMPLETE:String = "MyEventComplete";

    var myCustomProperty:*;

    public function MyCustomEvent(type:String, prop:*) :void
    {

      myCustomProperty = prop;

      super(type);
      // if you want your event to bubble 
      // be sure to specify : super(type, true)
    }

   //override clone() so your event bubbles correctly
   public override function clone() :MyEvent {

     return new MyEvent(this.type, this.myCustomProperty)

   }
  }
}

他のイベントと同じように、カスタム イベントのイベント リスナーを追加できるようになりました。

addEventListener(MyCustomEvent.COMPLETE, someFunction);
于 2009-11-13T15:42:57.293 に答える
2

私は専門家ではありませんが、以下は私のために働いています。(罪のない人を保護するために名前が変更されました)。

これが私のカスタムイベントの1つです:

import flash.events.Event;
public class SomethingHappenedEvent extends Event {
    public static const SOMETHING_COMPLETE:String = "PictureTakenComplete";
    public var passedValue:int;

    public function SomethingHappenedEvent(i:int) {
        passedValue = i;
        super(SOMETHING_COMPLETE);      
    }
}

カスタム イベントをリッスンするようにリスナーを設定しました。カスタム イベントが発生すると、doSomething()関数が実行されます。設定方法は次のとおりです。

mySecret.addEventListener(SomethingHappenedEvent.SOMETHING_COMPLETE,doSomething);

関数内で、イベントのパラメーターdoSomething()にアクセスできます。passedValue

private function doSomething(e:SomethingHappenedEvent):void {
    trace("did something: " + e.passedValue);
}

最後に、パラメーターを渡して、コードの別の場所にカスタム イベントをディスパッチする方法を次に示します。

this.dispatchEvent(new SomethingHappenedEvent(myCounter));
于 2009-11-13T14:48:33.850 に答える
2
  1. データ パラメータを使用してカスタム イベントを作成する
  2. クラス ( (MyObject など) は、addEventListener を使用して Event.COMPLETE をキャッチし、データを含むカスタム イベント MyCustomEvent をディスパッチする必要があります。
  3. MyCustomEvent を別の場所 (MyAnotherObject など) でキャッチします。

MyCustomEvent.as

package
{
 import flash.events.Event;

 public class MyCustomEvent extends Event
 {
  public static const MY_CUSTOM_EVENT_COMPLETE:String = "myCustomEventComplete";

  public var data:Object;

  // Constructor
  public function CaretEvent(type:String, data:Object, bubbles:Boolean=false, cancelable:Boolean=false)
  {
   super(type, true, cancelable);

   this.data = data;
  }

  // Public Methods
  public override function clone():MyCustomEvent
  {
   return new MyCustomEvent(type, data, bubbles, cancelable);
  }
 }
}

MyObject.as

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

 public class MyObject extends EventDispatcher
 {
  // Contructor
  public function MyObject()
  {
   addEventListener(Event.COMPLETE, onComplete)
  }

  // Private Methods
  private function onComplete(event:Event):void
  {
   dispatchEvent(new MyCustomEvent(MyCustomEvent.MY_CUSTOM_EVENT_COMPLETE, "This is my custom data"));
  }
 }
}

MyAnotherObject.as

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

 public class MyAnotherObject extends EventDispatcher
 {
  // Constructor
  public function MyAnotherObject()
  {
   addEventListener(MyCustomEvent.MY_CUSTOM_EVENT_COMPLETE, onMyCustomEventComplete)
  }

  // Private Methods
  private function onMyCustomEventComplete(event:MyCustomEvent):void
  {
   trace(event.data);
  }
 }
}
于 2009-11-13T16:46:22.920 に答える
0

物事の音から、必要なのが別のプロパティだけである場合、FileReference、Event.COMPLETEなどを拡張する必要はないかもしれません...次はあなたの目的のために機能しますか?そうでない場合は、同じページに表示されるようにコードを表示してください。

public function go():void {
    var downloadURL:URLRequest = new URLRequest("http://example.com/big.jpg");
    var otherParam:String = "another param";
    var fileRef:FileReference = new FileReference();
    fileRef.addEventListener(Event.COMPLETE, function(e:Event):void {
                                                handleLoad(e,otherParam); });
    fileRef.download(downloadURL);
}

public function handleLoad(e:Event,whatelse:String):void {
    Alert.show("we just loaded " + e.target + " with param " + whatelse);
}

これにより、作業を行う関数に追加のパラメーター(whatelse)が追加されます。handleLoad()または、ダウンロード時に追加のパラメーターがないと言っていますか?

于 2009-11-13T23:16:26.590 に答える
0

これにどのようにアプローチしているかを確認できるように、いくつかのコードを投稿していただけますか?

ただし、カスタム イベントの作成と使用に関するフレックス ライブ ドキュメントを読むことを強くお勧めします。

これは単純なカスタム イベント ベースのアプリケーションです。ソースを見てください。探しているものがあるかもしれません。

于 2009-11-13T14:36:58.283 に答える
0

私は通常、このようなことを行いますが、おそらく最良のアプローチではないかもしれませんが、この方法が利用可能であることを知っておく必要があります...

myObj.addEventListener("creationComplete", function(e:Event):void{otherFunction(e, "another Arg")});
于 2009-11-13T16:55:48.663 に答える