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

我不是专家,但以下内容对我有用。(更改名称以保护无辜者)。

这是我的自定义事件之一:

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);
  }
 }
}

我的对象.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"));
  }
 }
}

我的另一个对象.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

我通常会做这样的事情,也许不是最好的方法,但你应该知道这种方法是可用的......

myObj.addEventListener("creationComplete", function(e:Event):void{otherFunction(e, "another Arg")});
于 2009-11-13T16:55:48.663 回答
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

您能否发布一些代码,以便我们了解您的处理方式?

但是,我强烈建议阅读有关创建和使用自定义事件的flex 实时文档。

是一个简单的基于事件的自定义应用程序,看看源代码,它可能就是你要找的。

于 2009-11-13T14:36:58.283 回答