addEventListener не работает, когда dispatchEvent вызывается в модели (MVC) AS3 - PullRequest
2 голосов
/ 11 января 2011

У меня проблема с отправкой события в классе модели, которое отправляется правильно. При попытке прослушать это в клиенте ничего не слушается. Client.as создает все элементы MVC, такие как:

var _biosModel:IMultiDataModel = new BiosPanelModel();

Щелчок пользователя вызывает метод «update» в «BiosPanelModel.as», например:

override public function update():void
{
    debug("[BiosPanelModel.update]");
    dispatchEvent(new Event(Event.CHANGE)); // dispatch event
}

Client.as затем пытается прослушать это отправленное событие, но не делает, и я не знаю почему !? вот так:

this._biosModel.addEventListener(Event.CHANGE, eventHandler);

eventHandler не вызывается!

Надеюсь, кто-нибудь может мне помочь, так как я чувствую, что это должно быть просто! : - (

Спасибо за чтение

Chris

1 Ответ

3 голосов
/ 11 января 2011

Я бы начал с попытки установить для параметра bubbles значение true.Итак, отправьте событие следующим образом:

dispatchEvent(new Event(Event.CHANGE, true));

Это избавит вас от необходимости явно прослушивать событие в диспетчере и позволит захватывать событие в фазе пузырьков.

РЕДАКТИРОВАТЬ
Это НЕ окончательный ответ, все ответы ... и вы, вероятно, захотите удалить пузырьки = True, как только вызаставить его работать правильно, если вы не хотите явно отменить событие после его захвата.Причина в том, что событие Event.CHANGE является довольно распространенным, и всплытие этого события в цепочке списка отображения может быть грязным, особенно если есть другие обработчики, прослушивающие события CHANGE.Но он WILL сообщит вам, правильно ли вы подключаете слушателя.
END EDIT

Другая вещь, которую вы, возможно, захотите попробовать (так как этоне ясно из того, как у вас написан код выше), это добавить слушатель события сразу после создания экземпляра.Кроме того, убедитесь, что ваш _biosModel является свойством экземпляра, не определенным в рамках некоторой функции, которая его генерирует.

package ... {

    import flash.events.Event;    

    public class Something extends SomethingElse {

        var _biosModel:IMultiDataModel;

        public function Something() {
            this._biosModel = new BiosPanelModel();
            this._biosModel.addEventListener(Event.CHANGE, __eventHandler);
        }

        private function __eventHandler($evt:Event) {
            trace("SUCCESS");
        }
    }
}
...