3

如何在 Flex 中打开同步对话框?我需要从外部接口 (JavaScript) 调用一个函数,该函数将在 Flex 应用程序中打开一个简单的对话框,并根据用户单击的按钮(确定/取消)返回一个值。

所以它应该通过对对话框的同步调用,即调用等待直到用户像这样关闭对话框。

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

有人知道我该怎么做吗?我可以编写一个循环,等待对话框设置一个标志,然后读取结果以返回它,但必须有一些更优雅和可重用的东西来等待其他异步调用的完成。

编辑: 不幸的是,回调不起作用,因为调用 onApplicationUnload() 本身的 JavaScript 函数必须返回一个值(类似于 Flex 中的 onApplicationUnload() 函数)。这个 JavaScript 函数有一个固定的签名,因为它是由框架调用的,我无法更改它。或者换句话说:从 JavaScript 到 Flex 的调用也必须是同步的。

4

7 回答 7

3

Flex 不能以同步方式工作,因为它是一个单线程应用程序,因此需要您的代码将执行交回“核心”以处理用户输入等。

这样做的方法是使对话的行为异步:

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

function resultMethod(result:Boolean):void
{
    ExternalInterface.call("javaScriptCallback", [result]);
}
于 2008-10-09T16:02:39.037 回答
2

你不能在 Flex 中做到这一点。正如大卫所提到的,Flex 是单线程的,因此在处理对话框时您不能拥有功能块。

您最好的选择可能是使用 Javascript 弹出窗口。您对窗口的控制要少得多,但它应该按照您想要的方式运行(阻止函数直到它被关闭)。

于 2008-10-09T18:12:36.403 回答
1

让您的 Flex 代码使用事件来等待对话框。在主线程中,注册一个等待对话框关闭的事件处理程序。在对话框中的 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 的应用程序中,它工作得特别好。

于 2010-04-15T18:47:09.767 回答
1

我已经解释了在 flex 中创建同步警报的解决方法

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

于 2010-05-05T07:54:08.690 回答
0

好的......毕竟我找到了一个可能的解决方案。但我想几乎没有人会认真地这样做:-(

该解决方案侧重于使用 while 循环来检查结果,然后返回 JavaScript 正在调用的函数。然而,我们需要一种在 while 循环中休眠的方法,同时等待结果。然而,对 JavaScript 的调用是同步的。现在的诀窍是在 JavaScript 中进行睡眠,这在此处也不能直接使用,但可以使用同步 XML Http Request 来完成,如本博客所述。

正如我所说 - 我不会仅将其作为最后的手段来推荐。对于我的问题,我使用了丑陋的 JavaScript 弹出窗口。

于 2008-10-17T08:55:42.453 回答
0

让您的对话框调用 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
    }
}
于 2009-03-11T14:03:01.820 回答
-1

您可以通过弹出一个对话框然后在后台禁用所有内容来伪造 flex 中的同步对话框。Alert.show("Hello World");如果您在应用程序中这样做,您可以看到这一点。背景将变灰,用户将无法点击背景中的任何 UI。该应用程序将“等待”,直到用户单击“确定”按钮。

于 2008-10-17T08:59:39.390 回答