如何在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的调用也必须是同步的。

有帮助吗?

解决方案

你不能在Flex中这样做。正如David所说,Flex是单线程的,因此在处理对话框时不能使用功能块。

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

其他提示

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

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

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

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

让您的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中同步的最佳方式。它也适用于启动对话框。在仅限flex的应用程序中,它的工作特别好。

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

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

好的......毕竟我找到了一个可能的解决方案。但我想几乎每个人都不会那么认真: - (

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

正如我所说 - 我不会仅仅作为最后的手段推荐这个。对于我的问题,我使用了丑陋的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");,则可以看到此操作。背景将灰显,用户将无法在后台单击任何UI。该应用将<!>“等待<!>”;直到用户单击“确定”按钮。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top