Question

Comment puis-je ouvrir une boîte de dialogue synchrone dans Flex? Je dois appeler une fonction depuis une interface externe (JavaScript) qui ouvrira une boîte de dialogue simple dans l'application Flex et renverra une valeur en fonction du bouton sur lequel l'utilisateur a cliqué (OK / Annuler).

Il convient donc par un appel synchrone à une boîte de dialogue, c’est-à-dire que l’attente attende jusqu’à ce que l’utilisateur ait fermé la boîte de dialogue comme ceci.

//This function is called by JavaScript
function onApplicationUnload():Boolean
{
  var result:Boolean;
  result = showDialogAndWaitForResult();
  return result
}

Est-ce que quelqu'un sait comment je peux faire ça? Je pourrais écrire une boucle qui attend que le dialogue ait défini un drapeau, puis lire le résultat pour le renvoyer, mais il doit exister un élément beaucoup plus élégant et réutilisable pour attendre la fin des autres appels asynchrones.

MODIFIER: Malheureusement, un rappel ne fonctionne pas car la fonction JavaScript qui appelle onApplicationUnload () doit elle-même renvoyer une valeur (similaire à la fonction onApplicationUnload () de Flex). Cette fonction JavaScript a une signature fixe comme elle est appelée par un framework et je ne peux pas la changer. Ou en d'autres termes: l'appel de JavaScript à Flex doit également être synchrone.

Était-ce utile?

La solution

Vous ne pouvez pas faire cela dans Flex. Comme David l'a mentionné, Flex est à thread unique, vous ne pouvez donc pas disposer de votre bloc de fonctions pendant le traitement de la boîte de dialogue.

Votre meilleur choix pourrait être d’utiliser un popup Javascript. Vous aurez beaucoup moins de contrôle sur la fenêtre, mais celle-ci doit se comporter comme vous le souhaitez (bloquer la fonction jusqu'à ce qu'elle soit fermée).

Autres conseils

Flex ne fonctionne pas de manière synchrone, car il s'agit d'une application à un seul thread. Il est donc nécessaire que votre code soit transféré à l'exécution & "; cœur &"; afin de gérer les entrées de l'utilisateur, etc.

Pour ce faire, le comportement de votre dialogue doit être asynchrone:

function onApplicationUnload():void
{
    showDialog(resultMethod);
}

function resultMethod(result:Boolean):void
{
    ExternalInterface.call("javaScriptCallback", [result]);
}

Demandez à votre code Flex d’utiliser un événement pour attendre la boîte de dialogue. Dans le thread principal, enregistrez un gestionnaire d'événements qui attend la fermeture de la boîte de dialogue. Cliquez sur OK dans la boîte de dialogue, distribuez l’événement terminé.

Avec Cairngorm, cela ressemble à quelque chose comme:

Dans le fil principal:

CairngormEventDispatcher.getInstance().addEventListener(ClosingDialogCompleteEvent.DIALOG_COMPLETE, onClosingDialogComplete);

(si vous voulez éviter de revenir jusqu'à la fin, passez en boucle sur une minuterie et une variable globale.)

Dans le gestionnaire de fermeture de la boîte de dialogue:

CairngormEventDispatcher.dispatchEvent(new ClosingDialogCompleteEvent(<parameters>));

Le gestionnaire d'événements:


public function onClosingDialogComplete (e: ClosingDialogCompleteEvent):void
{
   param1 = e.param1;
   param2 = e.param2;
   // etc.
   // Continue processing or set the global variable that signals the main thread to continue.
}

Pour que cela fonctionne, la classe ClosingDialogCompleteEvent doit être définie. Le code partiel de la classe est:


package com. ... .event  // You define where the event lives.
{
import com.adobe.cairngorm.control.CairngormEvent;

public class ClosingDialogCompleteEvent extends CairngormEvent
{
    // Event type.
    public static const DIALOG_COMPLETE:String = "dialogComplete";

    public var param1:String;
    public var param2:String;

    public function ClosingDialogCompleteEvent(param1:String, param2:String)
    {
        super(DIALOG_COMPLETE);
        this.param1 = param1;
        this.param2 = param2;
    }
}
}

Attendre un événement est le meilleur moyen de synchroniser dans Flex. Cela fonctionne aussi bien pour les dialogues de démarrage. Dans les applications flex seulement, cela fonctionne particulièrement bien.

J'ai expliqué une solution de contournement pour créer une alerte synchrone dans flex

http://reallypseudorandom.blogspot.com /2010/05/flash-asynchronous-alert-and-pause.html

OK ... après tout, j'ai trouvé une solution possible. Mais je suppose que presque personne ne le fera sérieusement: - (

La solution consiste à utiliser une boucle while pour rechercher un résultat, puis à renvoyer la fonction appelée par JavaScript. Cependant, nous avons besoin d'un moyen de dormir dans la boucle while, en attendant le résultat. Cependant, les appels à JavaScript sont synchrones. Maintenant, l’astuce consiste à faire une pause en JavaScript, ce qui n’est pas non plus disponible directement ici, mais peut être effectué à l’aide d’une requête XML Http synchrone, comme décrit dans cette blog .

Comme je l’ai dit, je ne le recommanderai pas en dernier recours. Pour mon problème, j'ai eu recours à de jolis popups JavaScript.

Demandez à votre dialogue d’appeler une autre fonction de flex pour traiter le résultat de la sélection de l’utilisateur:

private function deleteFileCheck():void
{
  Alert.show("Are you sure you want to delete this file?",
             "Confirm Delete",
             Alert.YES| Alert.NO,
             this, deleteFileHandler, null, Alert.NO);
}

private function deleteFileHandler(event:CloseEvent):void
{
    if (event.detail == Alert.YES)
    {
        ...do your processing here
    }
}

Vous pouvez créer un dialogue synchrone en flex en ouvrant un dialogue puis en désactivant tout ce qui se trouve à l’arrière-plan. Vous pouvez voir cela en action si vous faites Alert.show("Hello World"); dans une application. L'arrière-plan est grisé et l'utilisateur ne peut cliquer sur aucune interface utilisateur en arrière-plan. L'application va & "Attendre &" jusqu'à ce que l'utilisateur clique sur le bouton OK.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top