Cairngorm XXX Команда должна выполняться несколько раз

У меня возникла проблема: я делаю ГИС-программу с помощью flex.

В моем приложении есть карта, когда я нажимаю один значок на карте, появляется окно A, когда я нажимаю ссылку внутри окна A, появляется окно B, но здесь моя проблема возникает, когда я закрываю окно B и нажимаю ссылку внутри окна A другое раз, два окнаB всплывают ...

В моем окне А у меня

...
var windowBEvt:WindowBEvent = new WindowBEvent();
CairngormEventDispatcher.getInstance().dispatchEvent(windowBEvt);
...
<control:WindowBControl id='control1'>

В WindowBControl у меня есть

addCommand(WindowBControl.EVENT_POPUPWindowB,WindowBCommand);

В WindowBCommand у меня есть

public function execute(event:CairngormEvent):void
{
    ...
    var windowB:WindowB = new WindowB();
    PopUpManager.addPopUp(windowB);
    ...
}

Может ли кто-нибудь помочь мне?

Большое спасибо!

С наилучшими пожеланиями, Шуо


person Shuo    schedule 08.10.2009    source источник


Ответы (3)


Унаследовал ли WindowBControl от FrontController? Если это так, вы, вероятно, случайно создаете его более одного раза. Этот:

<control:WindowBControl id='control1'>

собирается создать экземпляр этого фронт-контроллера. Поскольку вы поместили эту строку кода в WindowA, вы собираетесь создавать новый экземпляр этого контроллера каждый раз, когда вы создаете новый экземпляр WindowA. Это приведет к тому, что команды будут вызываться один раз для каждого экземпляра контроллера каждый раз, когда срабатывает ваше событие.

Вы должны создавать экземпляры передних контроллеров только в том случае, если вы уверены, что они будут созданы только один раз. Главное приложение mxml - хорошее место для этого.

person Tim Gautier    schedule 08.10.2009
comment
Ты прав, Тим! WindowBControl создается более одного раза, а во время отладки я заметил, что метод execute внутри WindowBCommand выполняется более одного раза. И Ваш ответ решает мой вопрос. Я поставил ‹control: WindowBControl id = 'control1'› внутри основного приложения, он работает правильно. Спасибо миллион! Возможно, у меня есть какое-то недоразумение по поводу Cairngorm. Обычно я помещаю FrontController в тот же mxml с действием, отправляющим CairngormEvent, я думал, что FrontController будет действовать быстро. Может ли диспетчер CairngormEvent прослушиваться по всей программе? - person Shuo; 10.10.2009

Первый

// Shouldn't this be in a FrontController class?
addCommand(WindowBControl.EVENT_POPUPWindowB,WindowBCommand);

Я думаю, вам нужно как-то вызвать PopupManager.removePopup, потому что в справочнике Flex 3 ActionScript указано:

Всплывает окно верхнего уровня. Рекомендуется вызывать removePopUp () для удаления всплывающих окон, созданных с помощью метода addPopUp (). Если класс реализует IFocusManagerContainer, окно будет иметь свой собственный FocusManager, так что, если пользователь использует клавишу TAB для перехода между элементами управления, доступ будет только к элементам управления в окне.

person user111677    schedule 08.10.2009
comment
Привет, друг! Во-первых, WindowBControl наследуется от FrontController. Во-вторых, я вызываю PopupManager.removePopup при закрытии windowB. - person Shuo; 10.10.2009

Нахожу другое решение.

В методе закрытия windowA я пишу

private function onClose():void
{
     PopUpManager.removePopUp(this);
     if(CairngormEventDispatcher.getInstance().hasEventListener(WindowBControl.EVENT_POPUPWindowB))
     {
         control1.removeCommand(WindowBControl.EVENT_POPUPWindowB);
     }

}
person Shuo    schedule 10.10.2009