2009-10-08 7 views
1

J'ai rencontré un problème. Je fais un programme SIG en utilisant flex.Cairngorm XXXCommand être exécuté plusieurs fois

Il y a une carte dans mon application, quand je clique sur une icône sur la carte, fenêtreA apparaît, quand je clique sur un lien dans la fenêtreA, la fenêtreB apparaît, mais ici mon problème ressort, quand je ferme lien dans WINDOWA une autre fois, deux WindowB pop up ...

Dans mon WINDOWA, je

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

En WindowBControl, je

addCommand(WindowBControl.EVENT_POPUPWindowB,WindowBCommand); 

En WindowBCommand, je

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

Quelqu'un pourrait-il me donner un coup de main?

Merci beaucoup!

Best, Shuo

Répondre

1

Est-ce que WindowBControl héritera de FrontController? Si c'est le cas, vous l'instanciez probablement plus d'une fois par accident. Cela:

<control:WindowBControl id='control1'> 

va créer une instance de ce contrôleur frontal. Puisque vous avez placé cette ligne de code dans WindowA, vous allez créer une nouvelle instance de ce contrôleur chaque fois que vous créez une nouvelle instance de WindowA. Cela entraînera l'appel de commandes une fois pour chaque instance du contrôleur chaque fois que votre événement se déclenche.

Vous ne devez instancier les contrôleurs frontaux que si vous êtes sûr qu'ils ne seront instanciés qu'une seule fois. L'application principale mxml est un bon endroit pour cela.

+0

Vous avez raison, Tim! WindowBControl est instancié plus d'une fois, tandis que je débogue, je remarque que la méthode execute dans WindowBCommand est exécutée plus d'une fois. Et votre réponse résout ma question.J'ai mis à l'intérieur de l'application principale, cela fonctionne correctement.Merci un million!Peut-être que j'ai un peu de malentendu sur Cairngorm. Habituellement, j'ai mis le FrontController dans le même mxml avec l'action distribuant le CairngormEvent, je pensais que le FrontController agirait rapidement. L'envoi CairngormEvent pourrait-il être écouté dans tout le programme? – Shuo

1

Première

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

Je pense que vous devez appeler en quelque sorte PopupManager.removePopup parce que les Flex 3 états de référence ActionScript:

ouvre une fenêtre de niveau supérieur . Il est recommandé d'appeler removePopUp() pour supprimer les fenêtres contextuelles créées à l'aide de la méthode addPopUp(). Si la classe implémente IFocusManagerContainer, la fenêtre aura son propre FocusManager de sorte que, si l'utilisateur utilise la touche TAB pour naviguer entre les contrôles, seuls les commandes de la fenêtre sont accessibles

+0

Hey ami, D'abord, WindowBControl hérite de FrontController. Ensuite, j'appelle PopupManager.removePopup lors de la fermeture de windowB. – Shuo

0

Je trouve une autre solution.

Dans la méthode de fermeture de WINDOWA, je vous écris

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

} 
Questions connexes