ثني:لماذا لا أستطيع التعامل مع أحداث معينة؟

StackOverflow https://stackoverflow.com/questions/130720

  •  02-07-2019
  •  | 
  •  

سؤال

في بعض الحالات، لا يبدو أنني أستطيع الحصول على مكونات لتلقي الأحداث.

[يحرر]

للتوضيح، رمز المثال هو فقط من أجل العرض التوضيحي، ما كنت أسأله حقًا هو ما إذا كان هناك موقع مركزي يمكن إضافة المستمع إليه، والذي يمكن للمرء إرسال الأحداث إليه بشكل موثوق من وإلى كائنات عشوائية.

انتهى بي الأمر باستخدام ParentApplication لإرسال واستلام الحدث الذي أحتاج إلى التعامل معه.

[/يحرر]

إذا كان هناك مكونان لهما أصول مختلفة، أو كما في المثال أدناه، أحدهما عبارة عن نافذة منبثقة، فيبدو أن الحدث لا يصل أبدًا إلى المستمع (راجع الطريقة "popUp" للإرسال الذي لا يعمل):

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
        layout="absolute" 
        initialize="init()">
<mx:Script>
    <![CDATA[
        import mx.controls.Menu;
        import mx.managers.PopUpManager;

        // Add listeners
        public function init():void
        {
            this.addEventListener("child", handleChild);
            this.addEventListener("stepchild", handleStepchild);
        }

        // Handle the no pop button event
        public function noPop(event:Event):void
        {
            dispatchEvent(new Event("child"));
        }

        // Handle the pop up
        public function popUp(event:Event):void
        {
            var menu:Menu = new Menu();
            var btnMenu:Button = new Button();
            btnMenu.label = "stepchild";
            menu.addChild(btnMenu);
            PopUpManager.addPopUp(menu, this);

            // neither of these work...
            this.callLater(btnMenu.dispatchEvent, [new Event("stepchild", true)]);
            btnMenu.dispatchEvent(new Event("stepchild", true));
        }

        // Event handlers

        public function handleChild(event:Event):void 
        {
            trace("I handled child");
        }

        public function handleStepchild(event:Event):void {
            trace("I handled stepchild");
        }
    ]]>
</mx:Script>

<mx:VBox>
    <mx:Button label="NoPop" id="btnNoPop" click="noPop(event)"/>
    <mx:Button label="PopUp" id="btnPop" click="popUp(event)"/>
</mx:VBox>
</mx:Application>

يمكنني التفكير في حلول بديلة، لكن يبدو أنه يجب أن يكون هناك بعض الأحداث المركزية...

هل فاتني شيء؟

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

المحلول

أعلاه هو الصحيح.أنت ترسل الحدث من btnMenu، لكنك لا تستمع إلى الأحداث الموجودة على btnMenu - أنت تستمع إلى الأحداث الموجودة على التطبيق.

إما الإرسال من التطبيق:

dispatchEvent(new Event("stepchild", true));

أو الاستماع على btnMenu

btnMenu.addEventListener("stepchild",handleStepChild);
btnMenu.dispatchEvent(new Event("stepchild",true));

نصائح أخرى

أنت تعلق المستمع ل this عندما يتم إرسال الحدث من btnMenu.

يجب أن يعمل هذا:

dispatchEvent(new Event("stepchild", true));

ملاحظة.ليس هناك حقا سبب لوضع غير ضروري "this"في كل مكان، ما لم يكن ذلك مطلوبًا بشكل صريح للتغلب على مشكلات النطاق.في هذه الحالة يمكنك فقط ترك كل this خارج.

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