Flexの同期ダイアログ?
-
06-07-2019 - |
質問
Flexで同期ダイアログを開くにはどうすればよいですか? Flexアプリケーションで簡単なダイアログを開き、ユーザーがクリックしたボタン(OK /キャンセル)に応じて値を返す関数を外部インターフェイス(JavaScript)から呼び出す必要があります。
したがって、ダイアログへの同期呼び出しによって、つまり、ユーザーがこのようなダイアログを閉じるまで呼び出しが待機する必要があります。
//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はシングルスレッドアプリケーションであるため、同期的に動作しません。そのため、<!> quot; core <!> quotに実行を戻すコードが必要です。ユーザー入力などを処理するため
それを行う方法は、ダイアログの動作を非同期にすることです:
function onApplicationUnload():void
{
showDialog(resultMethod);
}
function resultMethod(result:Boolean):void
{
ExternalInterface.call("javaScriptCallback", [result]);
}
Flexコードでイベントを使用してダイアログを待機させます。メインスレッドで、ダイアログが閉じるのを待つイベントハンドラーを登録します。ダイアログの[OK]で、ダイアログの完了イベントをディスパッチします。
ケアンゴームの場合、これは次のようなものです:
メインスレッド内:
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で同期する最良の方法です。起動ダイアログでもうまく機能します。フレックスのみのアプリケーションでは、特にうまく機能します。
フレックスで同期アラートを作成するための回避策を説明しました
http://reallypseudorandom.blogspot.com /2010/05/flash-asynchronous-alert-and-pause.html
OK ...やっぱり解決策が見つかりました。しかし、誰もがそれを真剣に行うことはほとんどないと思います:-(
ソリューションは、whileループを使用して結果を確認し、JavaScriptによって呼び出されている関数を返すことに焦点を当てています。ただし、結果を待っている間にwhileループでスリープする方法が必要です。ただし、JavaScriptの呼び出しは同期的です。ここでの秘theはJavaScriptでスリープ状態にすることです。これもここでは直接利用できませんが、このブログ。
私が言ったように、これは最後の手段としてのみお勧めしません。私の問題のために、私はい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
}
}
フレックスでダイアログをポップアップ表示し、バックグラウンドですべてを無効にすることで、同期ダイアログを偽造できます。アプリケーションでAlert.show("Hello World");
を実行すると、実際にこれを確認できます。背景は灰色表示になり、ユーザーは背景のUIをクリックできなくなります。アプリは<!> quot; wait <!> quot;ユーザーが[OK]ボタンをクリックするまで。