我正在使用此代码创建自定义Event类:
package evt {
import flash.events.EventDispatcher;
import flash.events.Event;
public class OtherEvent extends Event {
public static const OTHER:String = "OtherEvent";
public var data:*;
public function OtherEvent(type:String, data:*) {
this.data = data;
super(type, true);
}
}
}
这让我可以轻松传递我将在data属性中找到的对象,这样如果我通过:
var d = {point:50};
dispatchEvent(new OtherEvent(OtherEvent.OTHER,d));
我会通过写evt.data.point
找到关键'点'的值。
事实是,当我编译时,我收到1202错误(访问包evt中的未定义属性数据)。
奇怪的是以下内容:
只有在我使用dot synthax时才会出现错误:
例如。 trace(evt.data.point);
写作时我没有收到任何错误:trace(evt['data']['point']);
你能帮我理解它发生了什么以及为什么?
编辑:在严格模式下,第一个阻止任何事情。当不在严格模式时,我得到ReferenceError#1075变量evt :: data未定义。
答案 0 :(得分:1)
确保您的事件处理程序设置为接收“OtherEvent”而不是“Event”的实例。
private function otherEventHandler(evt:OtherEvent):void {
trace(evt.data);
}
此外,不是使用通配符键入“data”参数,而是将其键入为Object。
编辑:啊,我现在看到了。我认为你的问题是类包是“evt”,事件处理程序中的变量名也是“evt”。它向编译器抛出一个错误,因为它试图访问一个名为“evt.data”的包。简单修复 - 将您的类包更改为“事件”(推荐)或将您的变量名称更改为“e”。答案 1 :(得分:0)
尽量使您的代码尽可能具有限制性:
package evt {
import flash.events.Event;
public class OtherEvent extends Event {
public static const OTHER:String = "OtherEvent";
public var data:Object; //specify the object type of your variable
public function OtherEvent(type:String, data:Object) {
super(type,true)
this.data = data; //create your super object first, then set data
}
}
}
创建和分发您的对象:
var d:Object = {point:50}; //Specify the object type of your variable
dispatchEvent(new OtherEvent(OtherEvent.OTHER,d));
要创建EventListener,您必须执行类似
的操作addEventListener(OtherEvent.OTHER,onOther);
最后是你的处理函数
private function onOther(e:OtherEvent){
trace(e.data.point); //traces 50
}
这应该是你的伎俩
答案 2 :(得分:0)
我在这里看到两个注意事项
// change
var d = {point:50};
// to
var d:Object = new Object()
d.point = 50;
在AS3中,你应该总是在你没有打字时输入你的变量,你会看到一些有趣的结果。
另外需要注意的是“*”打字。我个人从不使用这个。这很容易出错。虽然,其他一些人可能不同意我会说不惜一切代价避免这种情况。
So change
public var data:*;
//to
public var data:Object
// and you should get good results
如果你进行了这两项修改,你应该没问题。