将属性附加到Flex / AS3中的事件

时间:2009-11-13 14:16:34

标签: flex actionscript-3 events custom-events event-dispatching

我有一个需要与事件一起传递的参数。在尝试通过扩展类将它放在类型上失败之后,我在另一个SO问题中被建议写一个自定义事件。

之前我尝试了这个,但我无法弄清楚如何发送它,因为我只想在FileReference上发送另一个带有正常Event.COMPLETE事件的参数。我不能Event.COMPLETE开火然后发送我的事件因为那时我将在同一条船上...所需的参数不会出现在最初的Event.COMPLETE对象中所以我不会能够将传递该参数的新事件分派给实际执行工作的代码。

非常感谢所有帮助,非常需要它。感谢。

基本上,我需要完全替换Event.COMPLETE功能,我只需要一个能够保存我额外属性的事件。请告诉我有一些方法可以做到这一点。

6 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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));

答案 2 :(得分:2)

  1. 使用数据参数
  2. 创建自定义事件
  3. 您的类(例如MyObject)应使用addEventListener捕获Event.COMPLETE,并将您的自定义事件MyCustomEvent与您的数据一起分发
  4. 在其他地方(例如在MyAnotherObject中)抓住您的MyCustomEvent
  5. 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);
      }
     }
    }
    

答案 3 :(得分:0)

您可以发布一些代码,以便我们了解您是如何接近这个的吗?

但我强烈建议您阅读有关创建和使用自定义事件的flex live docs

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

答案 4 :(得分:0)

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

myObj.addEventListener("creationComplete", function(e:Event):void{otherFunction(e, "another Arg")});

答案 5 :(得分: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())。或者你是说在下载时你没有附加参数?