Синхронные диалоги во Flex? - PullRequest
       38

Синхронные диалоги во Flex?

3 голосов
/ 09 октября 2008

Как открыть синхронный диалог во Flex? Мне нужно вызвать функцию из внешнего интерфейса (JavaScript), которая откроет простой диалог в приложении Flex и вернет значение в соответствии с кнопкой, которую пользователь нажал (OK / Отмена).

Таким образом, при синхронном обращении к диалогу, т. Е. Вызов будет ждать, пока пользователь не закроет диалоговое окно, как это.

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

Кто-нибудь знает, как я могу это сделать? Я мог бы написать цикл, который ждет, пока диалоговое окно не установит флаг, а затем читает результат, чтобы вернуть его, но должно быть что-то более элегантное и многократно используемое для ожидания завершения других асинхронных вызовов.

EDIT: К сожалению, обратный вызов не работает, так как функция JavaScript, которая вызывает onApplicationUnload (), сама должна возвращать значение (аналогично функции onApplicationUnload () во Flex). Эта функция JavaScript имеет фиксированную подпись, так как она вызывается фреймворком, и я не могу ее изменить. Или другими словами: вызов из JavaScript во Flex также должен быть синхронным.

Ответы [ 7 ]

3 голосов
/ 09 октября 2008

Flex не работает синхронно, так как это однопоточное приложение и поэтому требует, чтобы ваш код возвращал выполнение к «ядру» для обработки пользовательского ввода и т. Д.

Способ сделать это, чтобы поведение вашего диалога было асинхронным:

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

function resultMethod(result:Boolean):void
{
    ExternalInterface.call("javaScriptCallback", [result]);
}
2 голосов
/ 09 октября 2008

Вы не можете сделать это во Flex. Как отметил Дэвид, Flex является однопоточным, поэтому у вас не может быть функционального блока во время обработки диалога.

Лучше всего использовать всплывающее окно Javascript. У вас будет намного меньше контроля над окном, но оно должно вести себя так, как вы хотите (блокируя функцию, пока оно не будет закрыто).

1 голос
/ 05 мая 2010

Я объяснил обходной путь для создания синхронного оповещения в flex

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

1 голос
/ 15 апреля 2010

Пусть ваш код Flex использует событие для ожидания диалога. В главном потоке зарегистрируйте обработчик событий, который ожидает закрытия диалога. Нажмите ОК в диалоговом окне и отправьте событие завершения диалога.

С Cairngorm это что-то вроде:

В основной теме:

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

(если вы хотите избежать возврата до завершения, выполните цикл по таймеру и глобальной переменной.)

В обработчике закрытия диалога:

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

Обработчик события:


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

Чтобы это работало, должен быть определен класс ClosingDialogCompleteEvent. Неполный код для класса:


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

Ожидание события - лучший способ синхронизации во Flex. Это хорошо работает и для диалогов запуска. В гибком приложении это работает особенно хорошо.

0 голосов
/ 11 марта 2009

Пусть ваш диалог вызывает другую функцию в flex для обработки результата выбора пользователя:

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
    }
}
0 голосов
/ 17 октября 2008

Вы можете подделать синхронный диалог в flex, открыв диалоговое окно и отключив все в фоновом режиме Вы можете увидеть это в действии, если вы введете Alert.show("Hello World"); в приложении. Фон станет серым, и пользователь не сможет щелкнуть по любому пользовательскому интерфейсу в фоновом режиме. Приложение будет «ждать», пока пользователь не нажмет кнопку ОК.

0 голосов
/ 17 октября 2008

ОК ... в конце концов я нашел возможное решение. Но я думаю, что вряд ли все будут делать это всерьез: - (

Решение сосредоточено на использовании цикла while для проверки результата, а затем возврата функции, вызываемой JavaScript. Однако нам нужен способ спать в цикле while, пока мы ждем результата. Однако вызовы JavaScript являются синхронными. Теперь хитрость заключается в том, чтобы засыпать в JavaScript, который также не доступен здесь напрямую, но может быть выполнен с использованием синхронного XML-запроса HTTP, как описано в этом блоге .

Как я уже сказал - я не буду рекомендовать это только в качестве последнего средства. Для решения моей проблемы я прибег к ужасным всплывающим окнам JavaScript.

...