ثني:لماذا لا أستطيع التعامل مع أحداث معينة؟
-
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
خارج.