3

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 への呼び出しも同期的でなければなりません。

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 ではそれができません。David が述べたように、Flex はシングル スレッドであるため、ダイアログの処理中に関数ブロックを使用することはできません。

最善の策は、Javascript ポップアップを使用することです。ウィンドウを制御することはほとんどできませんが、ウィンドウは希望どおりに動作するはずです (ウィンドウが閉じられるまで機能をブロックします)。

于 2008-10-09T18:12:36.403 に答える
1

フレックスで同期アラートを作成する回避策を説明しました

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

于 2010-05-05T07:54:08.690 に答える
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 で同期するための最良の方法です。起動ダイアログでもうまく機能します。フレックスのみのアプリケーションでは、特にうまく機能します。

于 2010-04-15T18:47:09.767 に答える
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 に答える
0

OK...結局私は可能な解決策を見つけました。しかし、私は誰もがそれを真剣に行うことはほとんどないと思います:-(

このソリューションは、whileループを使用して結果を確認し、JavaScriptによって呼び出されている関数を返すことに重点を置いています。ただし、結果を待っている間、whileループでスリープする方法が必要です。ただし、JavaScriptの呼び出しは同期的です。ここでの秘訣は、JavaScriptでスリープを作成することです。これもここでは直接利用できませんが、このブログで説明されているように、同期XMLHttpリクエストを使用して実行できます。

私が言ったように-私はこれを最後の手段としてのみお勧めしません。私の問題のために、私は醜いJavaScriptポップアップに頼ってきました。

于 2008-10-17T08:55:42.453 に答える
-1

ダイアログをポップアップしてからバックグラウンドですべてを無効にすることにより、flexで同期ダイアログを偽造できます。アプリケーションで行う場合は、これが実際に動作していることを確認できAlert.show("Hello World");ます。背景がグレー表示され、ユーザーは背景のUIをクリックできなくなります。アプリは、ユーザーが[OK]ボタンをクリックするまで「待機」します。

于 2008-10-17T08:59:39.390 に答える