ошибка 1202, доступ к неопределенному свойству из пользовательского класса Event - PullRequest
2 голосов
/ 18 июля 2011

Я использую этот код для создания пользовательского класса 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));

Я найду значение ключа 'point', написав evt.data.point.

Дело в том, что при компиляции я получаю сообщение об ошибке 1202 (доступ к неопределенным данным свойств в пакете evt).

Странная вещь заключается в следующем:

  1. ошибка появляется только тогда, когда я использую точка синтакс: например. trace(evt.data.point);

  2. Я не получаю ошибку, когда пишу: trace(evt['data']['point']);

Не могли бы вы помочь мне понять, что происходит и почему?

РЕДАКТИРОВАТЬ: в строгом режиме первый блокирует что-либо. Когда я не в строгом режиме, я получаю ReferenceError # 1075 переменная evt :: data не определена.

Ответы [ 3 ]

1 голос
/ 18 июля 2011

Убедитесь, что ваш обработчик событий настроен на получение экземпляра «OtherEvent», а не «Event».

private function otherEventHandler(evt:OtherEvent):void {
    trace(evt.data);
}

Кроме того, вместо того, чтобы вводить параметр «data» с подстановочными знаками, введите его как Object.

РЕДАКТИРОВАТЬ: Ах, теперь я вижу. Я думаю, что ваша проблема в том, что пакет классов - «evt», а имя переменной в вашем обработчике событий - также «evt». Он выдает ошибку компилятору, потому что он пытается получить доступ к пакету с именем "evt.data". Простое исправление - либо поменяйте пакет вашего класса на «events» (рекомендуется), либо измените имя переменной на что-то вроде «e».

0 голосов
/ 18 июля 2011

Здесь я вижу две заметки

// change
var d = {point:50};
// to 
var d:Object = new Object()
    d.point = 50;

В AS3 вы всегда должны набирать cast свои переменные, когда вы не печатаете cast, вы получаете некоторые забавные результаты, которые видите.
И еще один пункт, который нужно отметить, это "*" печатать. Лично я никогда не использую это. Это подвержено ошибкам. Хотя некоторые другие могут не согласиться, я бы сказал, избегайте этого любой ценой.

So change
public var data:*;
//to 
public var data:Object
// and you should get good results

Если вы сделаете эти два изменения, все будет в порядке.

0 голосов
/ 18 июля 2011

Постарайтесь сделать свой код максимально ограниченным:

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
}

Это должно помочь вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...