سؤال

كيف يمكنني فتح مربع حوار متزامن في فليكس؟أحتاج إلى استدعاء وظيفة من واجهة خارجية (JavaScript) من شأنها فتح مربع حوار بسيط في تطبيق Flex وإرجاع قيمة وفقًا للزر الذي نقر عليه المستخدم (موافق/إلغاء).

لذلك يجب أن يتم ذلك عن طريق استدعاء متزامن لمربع حوار، أي.تنتظر المكالمة حتى يقوم المستخدم بإغلاق مربع الحوار بهذا الشكل.

//This function is called by JavaScript
function onApplicationUnload():Boolean
{
  var result:Boolean;
  result = showDialogAndWaitForResult();
  return result
}

هل يعرف أحد كيف يمكنني القيام بذلك؟يمكنني كتابة حلقة تنتظر حتى يحدد مربع الحوار علامة ثم تقرأ النتيجة لإعادتها، ولكن يجب أن يكون هناك شيء أكثر أناقة وقابل لإعادة الاستخدام لانتظار إكمال المكالمات غير المتزامنة الأخرى.

يحرر:لسوء الحظ، لا يعمل رد الاتصال لأن وظيفة JavaScript التي تستدعي onApplicationUnload() نفسها يجب أن تُرجع قيمة (على غرار وظيفة onApplicationUnload() في Flex).تحتوي وظيفة JavaScript هذه على توقيع ثابت كما يطلق عليه إطار العمل ولا يمكنني تغييره.أو بمعنى آخر:يجب أيضًا أن يكون الاتصال من JavaScript إلى Flex متزامنًا.

هل كانت مفيدة؟

المحلول

لا يمكنك فعل ذلك في فليكس.كما ذكر ديفيد، فليكس هو مؤشر ترابط واحد، لذلك لا يمكنك الحصول على كتلة وظيفتك أثناء معالجة مربع الحوار.

قد يكون أفضل رهان هو استخدام نافذة جافا سكريبت المنبثقة.سيكون لديك قدر أقل من التحكم في النافذة، ولكن يجب أن تتصرف بالطريقة التي تريدها (حظر الوظيفة حتى يتم إغلاقها).

نصائح أخرى

لا يعمل Flex بطريقة متزامنة، لأنه تطبيق ذو مؤشر ترابط واحد ولذلك يحتاج إلى التعليمات البرمجية الخاصة بك لإعادة التنفيذ إلى "الأساس" من أجل التعامل مع إدخال المستخدم وما إلى ذلك.

طريقة القيام بذلك هي جعل سلوك حوارك غير متزامن:

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 متزامن كما هو موضح في هذا مدونة.

كما قلت - لن أوصي بهذا فقط كملاذ أخير.بالنسبة لمشكلتي، لجأت إلى نوافذ جافا سكريبت المنبثقة القبيحة.

اطلب من مربع الحوار الخاص بك استدعاء وظيفة أخرى في 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"); في التطبيق.ستظهر الخلفية باللون الرمادي ولن يتمكن المستخدم من النقر على أي واجهة مستخدم في الخلفية.سوف "ينتظر" التطبيق حتى ينقر المستخدم على زر موافق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top