Обратный звонок слушателя события Flex не срабатывает - PullRequest
1 голос
/ 17 июня 2011

Может быть, вы можете помочь мне в этом правильном направлении. В нашем приложении я периодически замечаю, что определенный обработчик событий не запускается. В 99% случаев он работает нормально, но время от времени просто умирает. Как я могу узнать, что происходит? DispatchEvent () не происходит / работает как-то? Мой слушатель все еще слушает? Что-то еще перехватило событие и не передало его так, чтобы «правильный» слушатель смог добраться до него?

Вот немного кода ... code

Это несколько сокращенная версия реального кода, но я не думаю, что урезал что-то важное. Ключ, как я вижу, в том, что мы запускаем диалог параметров, а затем начинаем слушать закрытое событие. Затем мы покажем функцию закрытия диалоговых окон параметров. В случае неудачи сообщение трассировки «поймано событие закрытия ...» никогда не генерируется, и, следовательно, closeHandler вообще не вызывается.

Я не вижу там ничего неуместного, а вы?

Итак, какие инструменты в моем распоряжении, чтобы отследить этого маленького подонка?

Спасибо!

1 Ответ

1 голос
/ 17 июня 2011

Вы обрабатываете удаление вашего компонента из списка отображения изнутри компонента.Вы отправляете событие CLOSE до того, как фактически удалите его, но оно может очень хорошо прибыть, когда объект уже удален.Это связано с асинхронной природой событий.Это означает, что время от времени функция, которая обрабатывает событие, просто больше не существует, когда событие приходит.Конечно, если вы используете слабую ссылку.

решение

Теперь, чтобы решить проблему:

  • вы можете обработать событие закрытия вневаш компонент
  • Если вы хотите сохранить обработчик внутри компонента, вы можете удалить компонент в обработчике событий.Помните, что внутри этого замыкания вы не можете использовать PopUpManager.removePopUp(this), поскольку «this» относится не к компоненту, а к самому закрытию.
  • вы можете не использоватьслабая ссылка, но это не очень хорошая идея, так как ваш компонент не будет собираться из-за этого.То есть, если вы не удалите прослушиватель событий вручную из замыкания,

вот так:

var closeHandler:function = function(e:CloseEvent):void {
    trace("...");
    var p:Params = e.currentTarget as Params;
    p.removeEventListener(CloseEvent.CLOSE, closeHandler);

    /* other code that you want to execute in the closure */
}

var p:Params = PopUpManager.createPopUp(myApp, Params, true) as Params);
p.addEventListener(CloseEvent.CLOSE, closeHandler);
PopUpManager.centerPopUp(p);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...