如何在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的调用也必须是同步的。
答案 0 :(得分:3)
Flex不能以同步方式工作,因为它是单线程应用程序,因此需要您的代码将执行交还给“核心”以处理用户输入等。
这样做的方法是让对话的行为异步:
function onApplicationUnload():void
{
showDialog(resultMethod);
}
function resultMethod(result:Boolean):void
{
ExternalInterface.call("javaScriptCallback", [result]);
}
答案 1 :(得分:2)
你不能在Flex中这样做。正如David所说,Flex是单线程的,因此在处理对话框时不能使用功能块。
您最好的选择可能是使用Javascript弹出窗口。你对窗口的控制要少得多,但它应该按照你想要的方式运行(阻止函数直到它关闭)。
答案 2 :(得分:1)
让您的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的应用程序中,它的工作特别好。
答案 3 :(得分:1)
我已经解释了在flex中创建同步警报的解决方法
http://reallypseudorandom.blogspot.com/2010/05/flash-asynchronous-alert-and-pause.html
答案 4 :(得分:0)
好的......毕竟我找到了一个可能的解决方案。但我想几乎每个人都不会那么认真: - (
解决方案侧重于使用while循环检查结果,然后返回JavaScript调用的函数。但是我们需要一种在while循环中睡眠的方法,而我们正在等待结果。但是对JavaScript的调用是同步的。现在的诀窍是使用JavaScript进行休眠,这也不能直接在这里使用,但可以使用此blog中描述的同步XML Http请求来完成。
正如我所说 - 我不会仅仅作为最后的手段推荐这个。对于我的问题,我使用了丑陋的JavaScript弹出窗口。
答案 5 :(得分: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
}
}
答案 6 :(得分:-1)
您可以通过弹出对话框然后在后台禁用所有内容来伪装Flex中的同步对话框。如果您在应用程序中执行Alert.show("Hello World");
,则可以看到此操作。背景将灰显,用户将无法在后台单击任何UI。应用程序将“等待”,直到用户单击“确定”按钮。