Pergunta

Como posso abrir uma janela síncrona no Flex? Eu preciso chamar uma função a partir de uma interface externa (JavaScript) que irá abrir um diálogo simples no aplicativo Flex e retorna um valor de acordo com o botão o usuário clicou (OK / Cancelar).

Por isso, deve por uma chamada síncrona para um diálogo, ou seja, a chamada espera até que o usuário tenha fechado o diálogo como esta.

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

Alguém sabe como posso fazer isso? Eu poderia escrever um loop que aguarda até que o diálogo não definiu uma bandeira e, em seguida, lê o resultado de devolvê-lo, mas deve haver algo que é muito mais elegante e reutilizável para espera da realização de outras chamadas assíncronas.

EDIT: Infelizmente uma chamada de retorno não funciona como a função JavaScript que chamadas onApplicationUnload () em si tem de devolver um valor (semelhante à função onApplicationUnload () em Flex). Esta função JavaScript tem uma assinatura fixa, como é chamado por um quadro e eu não posso mudá-lo. Ou em outras palavras:. A chamada de JavaScript para Flex também deve ser síncrono

Foi útil?

Solução

Você não pode fazer isso no Flex. Como David mencionado, Flex é single-threaded, então você não pode ter o seu bloco de função enquanto o diálogo está sendo processado.

Sua melhor aposta seria usar um pop-up Javascript. Você terá muito menos controle sobre a janela, mas ele deve se comportar da maneira que quiser (bloqueio da função até que seja fechado).

Outras dicas

Flex não trabalho de forma síncrona, pois é uma única aplicação fio e por isso precisa de seu código para execução mão de volta para o "core" para lidar com a entrada do usuário etc.

A maneira de fazer isso é fazer assíncrono comportamento do seu diálogo:

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

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

Tenha o seu código Flex usar um evento que esperar para o diálogo. No segmento principal, registrar um manipulador de evento que espera que o diálogo para fechar. Em OK na caixa de diálogo, despachar o evento complete diálogo.

Com Cairngorm, isso é algo como:

No segmento principal:

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

(se você quiser evitar o retorno até completa, laço em um temporizador e variável global.)

No manipulador de fechamento de diálogo:

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

O manipulador 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 isso funcione, o ClosingDialogCompleteEvent classe tem de ser definido. código parcial para a 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;
    }
}
}

À espera de um evento é a melhor maneira de sincronizar em Flex. Ele funciona bem para diálogos de inicialização também. Em um aplicativo somente-flex funciona especialmente bem.

Já expliquei uma solução para criar alerta síncrona em flex

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

OK ... depois de tudo que eu encontrei uma solução possível. Mas eu acho que dificilmente todo mundo vai fazer isso a sério: - (

A solução centra-se em torno de usar um loop while para verificar se há um resultado e, em seguida, voltar a função que está sendo chamado por JavaScript. No entanto, precisamos de uma maneira de dormir no loop while, enquanto se espera para o resultado. No entanto chamadas para JavaScript são síncronas. Agora, o truque é fazer com que um sono em JavaScript, que também não está diretamente disponível aqui, mas pode ser feito usando um XML síncrona solicitação HTTP, como descrito nesta blogue .

Como eu disse - eu não recomendo isso apenas como último recurso. Para o meu problema que têm recorrido a pop-ups JavaScript feias.

Tenha sua chamada de diálogo outra função em flex para processar o resultado da seleção do usuário:

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

Você pode fingir um diálogo síncrono em flex por aparecendo uma caixa de diálogo, em seguida, desativando tudo no fundo. Você pode ver isso em ação se você fizer Alert.show("Hello World"); em um aplicativo. O fundo vai cinza para fora eo usuário não será capaz de clicar em qualquer interface do usuário em segundo plano. O aplicativo vai "esperar" até que o usuário clica no botão OK.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top