Domanda

Come posso aprire una finestra di dialogo sincrona in Flex? Devo chiamare una funzione da un'interfaccia esterna (JavaScript) che aprirà una semplice finestra di dialogo nell'applicazione Flex e restituirà un valore in base al pulsante su cui l'utente ha fatto clic (OK / Annulla).

Quindi dovrebbe essere tramite una chiamata sincrona a una finestra di dialogo, ovvero la chiamata attende fino a quando l'utente ha chiuso la finestra di dialogo in questo modo.

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

Qualcuno sa come posso farlo? Potrei scrivere un ciclo che attende fino a quando la finestra di dialogo ha impostato un flag e quindi legge il risultato per restituirlo, ma ci deve essere qualcosa di molto più elegante e riutilizzabile in attesa del completamento di altre chiamate asincrone.

Modifica Purtroppo un callback non funziona poiché la funzione JavaScript che chiama onApplicationUnload () stessa deve restituire un valore (simile alla funzione onApplicationUnload () in Flex). Questa funzione JavaScript ha una firma fissa come viene chiamata da un framework e non posso cambiarla. O in altre parole: anche la chiamata da JavaScript a Flex deve essere sincrona.

È stato utile?

Soluzione

Non puoi farlo in Flex. Come accennato da David, Flex è a thread singolo, quindi non è possibile avere il blocco funzione durante l'elaborazione della finestra di dialogo.

La soluzione migliore potrebbe essere quella di utilizzare un popup Javascript. Avrai molto meno controllo sulla finestra, ma dovrebbe comportarsi come vuoi (bloccando la funzione fino a quando non è stata chiusa).

Altri suggerimenti

Flex non funziona in modo sincrono, in quanto è un'applicazione a thread singolo e quindi ha bisogno del tuo codice per restituire l'esecuzione al " core " per gestire l'input dell'utente ecc.

Il modo per farlo è rendere asincrono il comportamento del tuo dialogo:

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

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

Chiedi al tuo codice Flex di utilizzare un evento per attendere la finestra di dialogo. Nel thread principale, registra un gestore eventi che attende la chiusura della finestra di dialogo. Su OK nella finestra di dialogo, invia l'evento di completamento della finestra di dialogo.

Con Cairngorm, questo è qualcosa del tipo:

Nel thread principale:

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

(se si desidera evitare il ritorno fino al completamento, eseguire il ciclo su un timer e una variabile globale.)

Nella finestra di dialogo gestore di chiusura:

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

Il gestore eventi:


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

Perché ciò funzioni, è necessario definire la classe ClosingDialogCompleteEvent. Il codice parziale per la classe è:


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

Attendere un evento è il modo migliore per sincronizzare in Flex. Funziona bene anche per le finestre di dialogo di avvio. In un'applicazione solo flessibile funziona particolarmente bene.

Ho spiegato una soluzione alternativa per creare un avviso sincrono in flex

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

OK ... dopo tutto ho trovato una possibile soluzione. Ma credo che quasi nessuno lo farà sul serio :-(

La soluzione si concentra sull'uso di un ciclo while per verificare un risultato e quindi restituire la funzione chiamata da JavaScript. Tuttavia, abbiamo bisogno di un modo per dormire nel ciclo while, mentre stiamo aspettando il risultato. Tuttavia, le chiamate a JavaScript sono sincrone. Ora il trucco è dormire in JavaScript, che non è direttamente disponibile qui, ma può essere fatto usando una richiesta HTTP XML sincrona come descritta in questo blog .

Come ho detto, non lo consiglierò solo come ultima risorsa. Per il mio problema ho fatto ricorso a brutti popup JavaScript.

Chiedi alla tua finestra di dialogo di chiamare un'altra funzione in flex per elaborare il risultato della selezione dell'utente:

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

Puoi falsificare una finestra di dialogo sincrona in formato flessibile aprendo una finestra di dialogo e disabilitando tutto in background. Puoi vederlo in azione se Alert.show("Hello World"); esegui un'applicazione. Lo sfondo diventerà grigio e l'utente non sarà in grado di fare clic su alcuna interfaccia utente in background. L'app & Quot; attende & Quot; fino a quando l'utente non fa clic sul pulsante OK.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top