错误1202,从自定义Event类访问未定义的属性

时间:2011-07-18 16:27:13

标签: actionscript-3 events

我正在使用此代码创建自定义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中的未定义属性数据)。

奇怪的是以下内容:

  1. 只有在我使用dot synthax时才会出现错误: 例如。 trace(evt.data.point);

  2. 写作时我没有收到任何错误:trace(evt['data']['point']);

  3. 你能帮我理解它发生了什么以及为什么?

    编辑:在严格模式下,第一个阻止任何事情。当不在严格模式时,我得到ReferenceError#1075变量evt :: data未定义。

3 个答案:

答案 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

如果你进行了这两项修改,你应该没问题。