Не получено событие, запущенное из класса .AS - PullRequest
1 голос
/ 16 июля 2010

У меня есть 2 файла, 1 для отправки события и 1 для его получения (конечно, в дополнение к самому классу события).

Я делал это раньше, поскольку файлы отправки и получения были mxml., но на этот раз the dispatching file is an actionscript class, и на этот раз не работает.Отличается ли он для классов ActionScript?

Вот упрощенная версия

Класс диспетчеризации отправляет событие, как только оно создано.

public class ASClass extends UIComponent{

     public function ASClass(){
        dispatchEvent(new MyEvents(MyEvents.FIRE_EVENT));
     }
}

В моем основном приложении mxml я создаю экземпляр ASClass, который автоматически отправляет событие, как только оно создано, и основное приложение mxml должно получить ответ.Но что-то не работает.

protected function appCComplete(event:FlexEvent):void{
    addEventListener(MyEvents.FIRE_EVENT, gotEvent);
    var asClass:ASClass = new ASClass();

}

protected function gotEvent(event:MyEvents):void{
       Alert.show("got event");         
}

1 Ответ

2 голосов
/ 16 июля 2010
addEventListener(MyEvents.FIRE_EVENT, gotEvent);

совпадает с

this.addEventListener(MyEvents.FIRE_EVENT, gotEvent);

, который прослушивает FIRE_EVENT, отправленный объектом this - вашим основным mxml-приложением. Чтобы прослушивать события, запущенные из объекта asClass, вы должны вызвать addEventListener для этого объекта.

asClass.addEventListener(MyEvents.FIRE_EVENT, gotEvent);

Таким образом, вы не можете прослушивать события, запущенные из конструктора. В следующем коде показан правильный способ прослушивания событий, запускаемых объектом asClass (из любого места, кроме конструктора).

protected function appCComplete(event:FlexEvent):void{
    var asClass:ASClass = new ASClass();
    asClass.addEventListener(MyEvents.FIRE_EVENT, gotEvent);
}

protected function gotEvent(event:MyEvents):void{
       Alert.show("got event");         
}

Если вы подумаете об этом, вы увидите, что это имеет смысл. Конструктор используется для создания объекта - подписчики событий обычно заинтересованы в некоторых действиях / изменениях, происходящих с объектом, когда объект полностью построен и функционирует.

Тем не менее, вы можете передать ссылку на this или функцию в конструктор ASClass и затем назначить эту функцию в качестве прослушивателя событий из конструктора, если хотите.

    public class ASClass extends UIComponent{
        public function ASClass(listener:Function){
            this.addEventListener(MyEvents.FIRE_EVENT, listener);
            dispatchEvent(new MyEvents(MyEvents.FIRE_EVENT));
        }
    }

    var asClass:ASClass = new ASClass(this.gotEvent);//pass the function.

//or

    public class ASClass extends UIComponent{
        public function ASClass(listenerObj:Object){
            this.addEventListener(MyEvents.FIRE_EVENT, listenerObj.gotEvent);
            dispatchEvent(new MyEvents(MyEvents.FIRE_EVENT));
        }
    }

    var asClass:ASClass = new ASClass(this);//pass the object.

Лично я не могу придумать много сценариев, в которых я хотел бы пойти по этому пути: подумайте о некотором редизайне, чтобы вы слушали события после того, как конструктор вернется.

...