Adobe Flex PopUpManager открыто несколько экземпляров TitleWindow

Настройка: приложение My Flex состоит из нескольких «субприложений». По сути, основная область приложения - это ApplicationControlBar с кнопками для каждого из подчиненных приложений. Остальная часть области представляет собой холст, на котором отображаются субприложения. Одновременно отображается только одно вспомогательное приложение. При переключении между субприложениями мы выполняем canvas.removeAllChildren (), затем canvas.addChild (subAppSwitchedTo). По сути, это ручная реализация ViewStack (плюсы и минусы которой не обсуждаются, поэтому воздержитесь от комментариев по этому поводу).

Проблема: в одном из моих субприложений (скажем, субприложение «А») у меня есть функция поиска, где результаты отображаются в всплывающем окне TitleWindow. Рабочий процесс похож на ввод критериев поиска, нажатие кнопки поиска, TitleWindow выскакивает с результатами (множественный выбор данных), выбирает желаемый результат (ы), щелкает OK, всплывающее окно исчезает (PopUpManager.removePopUp) и продолжает работу. Все работает нормально. Проблема в том, что если я переключаюсь на другое вспомогательное приложение (скажем, "B" - где A получает removeAllChildren () 'd, а B добавляется), а затем переключаюсь на назад на A и повторите поиск, когда откроется окно результатов TitleWindow, там будут ДВА, наложенных друг на друга. Если я продолжу уходить и возвращаться к A, каждый раз, когда я выполняю поиск, в «стопке» всплывающих окон будет появляться дополнительное всплывающее окно (по одному на каждый раз, когда A получает addChild () 'd).

Кто-нибудь еще испытал это? Я не уверен, что с этим делать, и это вызывает серьезную ошибку юзабилити в моем приложении. Это кому-нибудь звонит в колокола? Как будто мне как-то нужно очистить PopUpManager или что-то в этом роде (хотя я правильно вызываю removePopUp (), чтобы удалить TitleWindow). Пожалуйста помоги!


РЕДАКТИРОВАТЬ

Flex SDK = 4.5.1

// Subapp "A"
if (!certificateSearchTitleWindow)
{
  certificateSearchTitleWindow = new CertificateSearchTitleWindow;
  certificateSearchTitleWindow.addEventListener("searchAccept", searchOKPopupHandler);
  certificateSearchTitleWindow.addEventListener("searchCancel", searchClosePopupHandler);
}
PopUpManager.addPopUp(certificateSearchTitleWindow, this, true);

person istrasci    schedule 27.09.2011    source источник
comment
Можете ли вы опубликовать код, особенно там, где вы создаете / уничтожаете всплывающие окна? Кроме того, flex sdk 4.x? или 3.х?   -  person Jonathan Rowny    schedule 28.09.2011
comment
Правильно ли удаляются всплывающие окна в каждом рабочем процессе?   -  person Tony    schedule 28.09.2011
comment
Кроме того, это может быть актуально ... .com / en_US / flex / using /   -  person Tony    schedule 28.09.2011


Ответы (2)


Я предполагаю, что всплывающее окно удаляется из основного списка отображения, когда вы удаляете его родительский элемент (this в методе PopUpManager.addPopup ()), но не из его родительского списка отображения. Почему бы вам не прослушать в своих субприложениях событие Event.REMOVED, а затем удалить всплывающее окно? Это было бы :

private var pp:CertificateSearchTitleWindow;

private function onCreationComplete():void
{
    addEventListener(Event.REMOVED, onRemovede);
}

private function addPopUp():void
{
    if (!pp) {
        pp = new CertificateSearchTitleWindow();
        PopUpManager.addPopUp(pp, this, true);
    }
}

private function onRemoved(event:Event):void
{
    if (pp) {
        PopupManager.removePopUp(pp);
        pp = null;
    }
}
person LoremIpsum    schedule 28.09.2011

Спасибо тем, кто высказал предложения. Оказалось, что я перерегистрировал eventListener снова и снова.

Я использую синглтон в качестве «общей памяти» между субприложениями. Я устанавливал singleton.addEventListener(someType, listener) в обратном вызове creationComplete субприложения A. Поэтому каждый раз, когда я возвращался к A, выполнялся creationComplete и повторно добавлялся этот слушатель. После поиска метод слушателя (открывший всплывающее окно) вызывался несколько раз, то есть столько раз, сколько было добавлено событие.

xref: http://forums.adobe.com/message/3941163

person istrasci    schedule 28.09.2011
comment
Боже, не мог понять этого! :-) - person LoremIpsum; 29.09.2011