Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

С 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.Это также хорошо работает для диалоговых окон запуска.В приложении только для flex это работает особенно хорошо.

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

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

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

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

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

Попросите ваше диалоговое окно вызвать другую функцию в 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
    }
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top