Actionscript 3 如何调度添加了数据的事件-AS3
有谁能给我一个简单的例子,告诉我如何在actionscript3中调度一个附加了对象的事件,比如Actionscript 3 如何调度添加了数据的事件-AS3,actionscript-3,flash,apache-flex,events,dispatchevent,Actionscript 3,Flash,Apache Flex,Events,Dispatchevent,有谁能给我一个简单的例子,告诉我如何在actionscript3中调度一个附加了对象的事件,比如 dispatchEvent( new Event(GOT_RESULT,result)); 这里的result是我希望随事件一起传递的对象。如果您希望通过事件传递对象,您应该创建一个自定义事件。代码应该是这样的 public class MyEvent extends Event { public static const GOT_RESULT:String = "gotResult";
dispatchEvent( new Event(GOT_RESULT,result));
这里的
result
是我希望随事件一起传递的对象。如果您希望通过事件传递对象,您应该创建一个自定义事件。代码应该是这样的
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.
}
如果设计正确,您不必向事件传递对象。
相反,您应该在分派类上创建一个公共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.
这篇文章有点老,但如果它能帮助某人,您可以使用DataEvent类,如下所示:
dispatchEvent(new DataEvent(YOUR_EVENT_ID, true, false, data));
你自己也举了个例子。您到底被困在哪里?感谢您的回复,我是as3新手,希望知道如何通过dispatch event传递对象?您必须扩展event类,以创建自己的自定义事件对象。请看这里的一个例子:在我的例子中,结果是classA类型的-因此我不确定是否必须编写自定义事件,如果必须如何编写它..你是说传递对象是一个糟糕的设计决策,还是仅仅给出了一个替代方案?我这样问是因为Flash/Flex API似乎非常频繁地传递对象;我恭敬地表示不同意。向事件对象添加值是很好的封装。在许多情况下,我更喜欢这种方法,而不是内省currentTarget(或target)从实例上的公共变量检索数据。我发现这在显示列表中特别有用,其中一个事件将在显示层次结构中出现多个级别。虽然我有时使用这种方法,但它并不适合所有场景(您的第一句话可能会建议)。例如,如果有多个类调度同一事件(但没有公共子类),那么在这些情况下,自定义事件是一个更干净的路由。另外,关于利益分离还有一些话要说。如果分派事件的类没有理由知道正在侦听/处理事件的类,那么定制事件也更适合这种情况。使单元测试更容易哇,这似乎是一个棘手的问题subject@bfavaretto是的,这更像是一种选择。每种模式都有其优缺点。这就是应该如何做到的。一些小的补充;对于事件数据,我总是使用getter字段而不是公共字段。我还将GOT_RESULT重命名为RESULT以保持清晰。顺便说一句,我创建了一个在线工具来创建自定义as3事件,它可以帮助更快地设置。请随意使用。我同意将事件常量重命名为RESULT,我只是尽量让事情尽可能接近OP的示例变量名,以避免可能出现的任何混淆。@Tomislav Dyulgerov:嘿,谢谢你,伙计……你的代码非常有效,谢谢你的帮助,我非常感谢。