【问题标题】:How to dispatch an event with added data - AS3如何使用添加的数据调度事件 - AS3
【发布时间】:2012-09-17 09:23:46
【问题描述】:

谁能给我一个简单的例子,说明如何在 actionscript3 中调度事件并附加一个对象,例如

dispatchEvent( new Event(GOT_RESULT,result));

这里result 是我想与事件一起传递的对象。

【问题讨论】:

  • 你自己举了一个例子。你到底卡在哪里了?
  • 感谢回复,我是 as3 新手,想知道如何通过 dispatch 事件传递对象?
  • 您必须扩展 Event 类,以创建您自己的自定义事件对象。在此处查看示例:cookbooks.adobe.com/…
  • 在我的情况下,结果是 classA 类型 - 所以我不确定我是否必须编写自定义事件,如果我必须如何编写它..

标签: actionscript-3 flash apache-flex events dispatchevent


【解决方案1】:

如果你想通过事件传递一个对象,你应该创建一个自定义事件。代码应该是这样的。

public class MyEvent extends Event
{
    public static const GOT_RESULT:String = "gotResult";

    // this is the object you want to pass through your event.
    public var result:Object;

    public function MyEvent(type:String, result:Object, bubbles:Boolean=false, cancelable:Boolean=false)
    {
        super(type, bubbles, cancelable);
        this.result = result;
    }

    // always create a clone() method for events in case you want to redispatch them.
    public override function clone():Event
    {
        return new MyEvent(type, result, bubbles, cancelable);
    }
}

然后你可以像这样使用上面的代码:

dispatchEvent(new MyEvent(MyEvent.GOT_RESULT, result));

你会在必要时监听这个事件。

addEventListener(MyEvent.GOT_RESULT, myEventHandler);
// more code to follow here...
protected function myEventHandler(event:MyEvent):void
{
    var myResult:Object = event.result; // this is how you use the event's property.
}

【讨论】:

  • 应该这样做。一些小的补充;对于事件数据,我总是使用 getter 字段而不是公共字段。我还将 GOT_RESULT 重命名为 RESULT 以保持清晰。
  • 顺便说一句,我创建了一个在线工具来创建自定义 as3 事件projects.stroep.nl/EventGenerator 它可以帮助更快地设置。随意使用。
  • 我同意将事件常量重命名为 RESULT,我只是想让事情尽可能接近 OP 的示例变量名称以避免可能出现的任何混淆。
  • @ Tomislav Dyulgerov:嘿,谢谢伙计...您的代码绝对有效,感谢您提供的所有帮助。
【解决方案2】:

如果设计得当,您不必将对象传递给事件。
相反,您应该在调度类上创建一个公共 var。

public var myObject:Object;

// before you dispatch the event assign the object to your class var
myObject = ....// whatever it is your want to pass
// When you dispatch an event you can do it with already created events or like Tomislav wrote and create a custom class.

// in the call back just use currentTarget
public function myCallBackFunction(event:Event):void{

  // typecast the event target object
  var myClass:myClassThatDispatchedtheEvent = event.currentTarget as myClassThatDispatchedtheEvent 
  trace( myClass.myObject )// the object or var you want from the dispatching class.


【讨论】:

  • 你是说传递一个对象是一个糟糕的设计决策,还是只是提供一个替代方案?我问是因为 Flash/Flex API 似乎非常频繁地传递对象。
  • 如果我明白你刚才说的话;我恭敬地不同意。向事件对象添加值是很好的封装。在许多情况下,我更喜欢这种方法,而不是自省 currentTarget(或目标)以从实例上的公共变量中检索数据。我发现这在显示列表中特别有用,其中事件将在显示层次结构中冒出多个级别。
  • 虽然我有时会使用这种方法,但它并不适合所有场景(您的第一句话会暗示这一点)。例如,如果您有多个分派相同事件的类(但没有公共子类),那么在这些情况下,自定义事件是一条更清晰的路线。另外,关于利益分离还有一些话要说。如果调度事件的类没有理由知道正在侦听/处理事件的类,那么自定义事件也更适合这种情况。使单元测试更容易
  • 哇,这似乎是一个敏感的话题
  • @bfavaretto 是的,这更多是作为一种选择。每种模式都有其优点和缺点。
【解决方案3】:

这篇文章有点旧,但如果它可以帮助某人,你可以像这样使用 DataEvent 类:

dispatchEvent(new DataEvent(YOUR_EVENT_ID, true, false, data));

Documentation

【讨论】:

    猜你喜欢
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多