flex 4 - почему dispatchEvent вызывает созданиеCurplete рекурсивно - PullRequest
2 голосов
/ 01 марта 2012

У меня есть собственный компонент shopView, который является компонентом с поддержкой скинов MXML.У меня есть класс контроллера под названием ShopController, который заботится о показе этого компонента во всплывающем окне, обновлении информации, отображаемой в компоненте и т. Д.

Теперь я хотел бы манипулировать некоторыми из подкомпонентов этого ShopView после того, как он был создан изконтроллер после создается ShopView (событие creationComplete ())

Итак, я прикрепил прослушиватель событий, который стажер выполняет некоторый процесс инициализации

   creationComplete="init(event)" 

инициализации() функция

        private function init(event:FlexEvent):void{
            event.stopImmediatePropagation();
            initMenus();
            initSlots();
            dispatchEvent(event);
        }

Присоединено еще одно событие завершения создания из класса контроллера

     _shop.addEventListener(FlexEvent.CREATION_COMPLETE,onShopCreated);

* _shop является экземпляром ShopView *

Теперь, если вы видите функцию init (), там я прекращаю распространение события, выполняю некоторый процесс инициализации и после этого отправляю событие (контроллер магазина выполняет остальную часть работы)

Сейчас, это приводит к сбою приложения, потому что событие crationComplete ShopView вызывается рекурсивно.Я думал, что dispatchEvent будет распространяться на другие листеры, но похоже, что он распространяется обратно на тот же компонент.

Я исправил это, удалив строки e.stopImmediatePropagation () и dispatchEvent (событие)из функции init ().Но я хочу знать, почему это происходит так?

Это известная проблема для компонентов mxml / flex?ИЛИ это ожидаемое поведение?

Обновление: я не делаю то же самое в .as, как я сказал ниже.Получил ответ, в основном это моя глупость:)

, потому что я не видел такого поведения, когда пишу классы .as, где я предотвращаю распространение и отправляю событие на основе бизнес-логики.

Заранее спасибо.

1 Ответ

3 голосов
/ 01 марта 2012

Это ожидаемое поведение.

Когда вы повторно отправляете существующее событие, dispatchEvent автоматически клонирует его (поскольку вы не можете отправить одно и то же событие дважды.) Это удаляет все связанные с распространением флаги.

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

...