Adobe Flex PopUpManager - открыто несколько экземпляров окна TitleWindow - PullRequest
1 голос
/ 27 сентября 2011

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

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

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


EDIT

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);

Ответы [ 2 ]

1 голос
/ 28 сентября 2011

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

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

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

1 голос
/ 28 сентября 2011

Я предполагаю, что всплывающее окно удаляется из основного списка отображения при удалении его родителя ( 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...