문제

Flex에서 동기 대화 상자를 어떻게 열 수 있습니까? Flex 응용 프로그램에서 간단한 대화 상자를 열고 사용자가 클릭 한 버튼 (확인/취소)에 따라 값을 반환하는 외부 인터페이스 (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는 단일 스레드 애플리케이션이므로 동기식으로 작동하지 않으므로 사용자 입력 등을 처리하기 위해 "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에서 동기 경보를 만들기위한 해결 방법을 설명했습니다.

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

좋아 ... 결국 가능한 해결책을 찾았습니다. 그러나 나는 거의 모든 사람들이 진지하게 그렇게하지 않을 것 같아요 :-(

솔루션은 while 루프를 사용하여 결과를 확인한 다음 JavaScript에서 호출되는 함수를 반환하는 데 중점을 둡니다. 그러나 우리는 결과를 기다리는 동안 While 루프에서 잠을 잘 수있는 방법이 필요합니다. 그러나 JavaScript에 대한 호출은 동기입니다. 이제 트릭은 JavaScript에서 잠을자는 것입니다. 여기서도 직접 사용할 수는 없지만 여기에 설명 된 것과 같이 동기식 XML HTTP 요청을 사용하여 수행 할 수 있습니다. 블로그.

내가 말했듯이 - 나는 이것을 최후의 수단으로만 추천하지 않을 것입니다. 내 문제에 대해 나는 못생긴 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