2009-10-08 6 views
1

У меня возникла проблема. Я делаю программу ГИС с использованием flex.Cairngorm XXXCommand выполняется несколько раз

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

В моей windowA, я

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

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

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

Бест, Шо

ответ

1

ли WindowBControl наследовать от FrontController? Если это так, вы, вероятно, создаете его несколько раз при аварии. Это:

<control:WindowBControl id='control1'> 

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

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

+0

Ты прав, Тим! WindowBControl создается несколько раз, в то время как я отлаживаю, я замечаю, что метод execute внутри WindowBCommand работает более одного раза. И ваш ответ разрешает мой вопрос. Я положил внутри основного приложения, он работает правильно. Спасибо миллион! Возможно, у меня есть недоразумение на Cairngorm. Обычно я помещал FrontController в тот же mxml с действием, отправляющим CairngormEvent, я думал, что FrontController будет действовать быстро. Может ли диспетчер CairngormEvent прослушиваться по всей программе? – Shuo

1

Первый

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

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

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

+0

Эй друг, Во-первых, WindowBControl наследует от FrontController. Во-вторых, я вызываю PopupManager.removePopup при закрытии окнаB. – Shuo

0

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

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

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

} 
Смежные вопросы