Pregunta

¿Cómo puedo abrir un diálogo sincrónico en Flex? Necesito llamar a una función desde una interfaz externa (JavaScript) que abrirá un cuadro de diálogo simple en la aplicación Flex y devolverá un valor de acuerdo con el botón en el que el usuario ha hecho clic (Aceptar / Cancelar).

Entonces, por una llamada sincrónica a un diálogo, es decir, la llamada espera hasta que el usuario haya cerrado el diálogo de esta manera.

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

¿Alguien sabe cómo puedo hacer esto? Podría escribir un bucle que espere hasta que el cuadro de diálogo haya establecido un indicador y luego lea el resultado para devolverlo, pero debe haber algo que sea mucho más elegante y reutilizable para esperar la finalización de otras llamadas asincrónicas.

EDITAR: Desafortunadamente, una devolución de llamada no funciona ya que la función de JavaScript que invoca onApplicationUnload () en sí misma tiene que devolver un valor (similar a la función onApplicationUnload () en Flex). Esta función de JavaScript tiene una firma fija como la llama un marco y no puedo cambiarla. O en otras palabras: la llamada de JavaScript a Flex también debe ser sincrónica.

¿Fue útil?

Solución

No puedes hacer eso en Flex. Como David mencionó, Flex es de un solo subproceso, por lo que no puede tener su bloque de funciones mientras se procesa el diálogo.

Su mejor opción podría ser utilizar una ventana emergente de Javascript. Tendrá mucho menos control sobre la ventana, pero debe comportarse de la manera que desee (bloqueando la función hasta que se cierre).

Otros consejos

Flex no funciona de forma síncrona, ya que es una aplicación de subproceso único y, por lo tanto, necesita su código para devolver la ejecución a " core " para manejar la entrada del usuario, etc.

La forma de hacerlo es hacer que el comportamiento de su diálogo sea asíncrono:

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

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

Haga que su código Flex use un evento para esperar el diálogo. En el hilo principal, registre un controlador de eventos que espere a que se cierre el cuadro de diálogo. En Aceptar en el cuadro de diálogo, envíe el evento de diálogo completo.

Con Cairngorm, esto es algo como:

En el hilo principal:

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

(si desea evitar regresar hasta que se complete, active un temporizador y una variable global).

En el cuadro de diálogo de cierre del controlador:

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

El controlador de eventos:


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

Para que esto funcione, se debe definir la clase ClosingDialogCompleteEvent. El código parcial para la clase es:


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

Esperar un evento es la mejor manera de sincronizar en Flex. Funciona bien para los diálogos de inicio también. En una aplicación solo flexible, funciona especialmente bien.

He explicado una solución alternativa para crear alertas sincrónicas en flex

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

OK ... después de todo, encontré una posible solución. Pero supongo que casi todos van a hacer eso en serio :-(

La solución se centra en usar un bucle while para verificar un resultado y luego devolver la función que JavaScript está llamando. Sin embargo, necesitamos una forma de dormir en el ciclo while, mientras esperamos el resultado. Sin embargo, las llamadas a JavaScript son sincrónicas. Ahora el truco es dormir en JavaScript, que tampoco está disponible directamente aquí, pero se puede hacer usando una solicitud Http XML sincrónica como se describe en este blog .

Como dije, no lo recomendaré solo como último recurso. Para mi problema, he recurrido a feos popups de JavaScript.

Haga que su diálogo llame a otra función en flex para procesar el resultado de la selección del usuario:

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

Puede simular un cuadro de diálogo síncrono en flex al abrir un cuadro de diálogo y luego deshabilitar todo en segundo plano. Puede ver esto en acción si lo hace Alert.show("Hello World"); en una aplicación. El fondo se atenuará y el usuario no podrá hacer clic en ninguna interfaz de usuario en el fondo. La aplicación & "; Espera &"; hasta que el usuario haga clic en el botón Aceptar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top