Frage

Wie kann ich einen synchronen Dialog in Flex öffnen? Ich brauche eine Funktion von einem externen Interface (JavaScript) zu nennen, die einen einfachen Dialog in der Flex-Anwendung wird geöffnet und gibt einen Wert entsprechend der Schaltfläche der Benutzer geklickt hat (OK / Abbrechen).

So ist es zu einem Dialog durch einen synchronen Aufruf soll, das heißt der Anruf wartet, bis der Benutzer den Dialog wie folgt geschlossen.

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

Weiß jemand, wie ich das tun kann? Ich könnte eine Schleife schreiben, die wartet, bis der Dialog ein Flag gesetzt hat, und liest dann das Ergebnis es zurück, aber es muss etwas sein, das zum Warten auf die Vollendung anderer asynchrone Aufrufe Art und Weise eleganter und wiederverwendbar ist.

EDIT: Leider ist ein Rückruf nicht als die JavaScript-Funktion arbeitet, ruft onApplicationUnload () selbst hat einen Wert (ähnlich die onApplicationUnload () Funktion in Flex) zurückzukehren. Diese JavaScript-Funktion hat eine feste Signatur, wie sie durch einen Rahmen genannt wird, und ich kann es nicht ändern. Oder mit anderen Worten:. Der Aufruf von JavaScript Flex muss auch synchron sein

War es hilfreich?

Lösung

Sie können die in Flex nicht. Wie David erwähnte, Flex ist single-threaded, so dass Sie nicht Ihren Funktionsblock haben, während der Dialog verarbeitet wird.

Ihre beste Wette könnte sein, einen Javascript Popup zu verwenden. Sie werden viel weniger Kontrolle über das Fenster, aber es sollte, wie Sie wollen (Blockierung der Funktion, bis es geschlossen) verhalten.

Andere Tipps

Flex funktioniert nicht in einer synchronen Art und Weise, wie es eine einzelne Thread-Anwendung ist und so muss den Code zur Hand Ausführung zurück zum „Kern“, um Benutzereingaben usw. zu behandeln.

Die Art und Weise, es zu tun ist, um den Dialog Verhalten asynchron zu machen:

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

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

Haben Sie Ihren Flex-Code ein Ereignis verwenden, um den Dialog zu warten. In dem Haupt-Thread, registrieren, ein Event-Handler, der das Dialog wartet auf zu schließen. Auf OK im Dialog, schickt das Dialog vollständige Ereignis.

Mit Cairngorm, das ist so etwas wie:

In dem Haupt-Thread:

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

(wenn Sie auf einem Timer und globale Variable Rückgabe bis zur vollständigen, Schleife zu vermeiden.)

Im Dialog Schließen Handler:

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

Die Event-Handler:


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

Damit dies funktioniert, die Klasse ClosingDialogCompleteEvent definiert werden. Partial Code für die Klasse ist:


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

auf ein Ereignis Warten ist der beste Weg in Flex zu synchronisieren. Es funktioniert gut für zu Start Dialoge. In einer Flex-only-Anwendung funktioniert es besonders gut.

Ich habe eine Abhilfe erklärt Synchronalarm in Flex erstellen

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

OK ... schließlich fand ich eine mögliche Lösung. Aber ich denke, kaum wird jeder gehen, dass ernst tun: - (

Die Lösung konzentriert sich um eine while-Schleife mit für ein Ergebnis zu überprüfen und dann die Funktion zurück, die von JavaScript aufgerufen wird. Allerdings müssen wir einen Weg in der while-Schleife schlafen, während wir auf das Ergebnis warten. Allerdings ruft JavaScript synchron sind. Jetzt ist der Trick, einen Schlaf in JavaScript zu machen, die auch hier nicht direkt zur Verfügung steht, sondern kann mit einer synchronen XML HTTP-Anfrage durchgeführt werden, wie auf diese beschrieben Blog .

Wie gesagt - ich will nicht diese nur als letzten Ausweg empfehlen. Für mein Problem habe ich zu hässlich JavaScript Popups zurückgegriffen.

Haben Sie Ihren Dialog Aufruf einer anderen Funktion in flex das Ergebnis der Auswahl des Benutzers zu verarbeiten:

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
    }
}

Sie können gefälschter ein synchroner Dialog in flex durch einen Dialog Aufspringen dann alles im Hintergrund zu deaktivieren. Sie können dies in Aktion sehen, wenn Sie Alert.show("Hello World"); in einer Anwendung zu tun. Der Hintergrund wird grau aus, und der Benutzer nicht in der Lage sein, auf jedem UI im Hintergrund zu klicken. Die App wird „warten“, bis der Benutzer die OK-Schaltfläche klickt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top