Flex事件处理程序不起作用

时间:2010-08-11 06:52:10

标签: actionscript-3 flex3 flexbuilder

我在flex 3.5中创建了一个自定义事件。但是不调用处理程序。如何解决这个或者调试这个问题的方法是什么?

Event类:

package com.saneef.worldlanguages.events
{
    import flash.events.Event;

    public class LanguageEvent extends Event
    {
        public static const LANGUAGE_SELECTED:String = "LanguageSelected";

        public function LanguageEvent(type:String,languageid:String)
        {
            super(type);
            this.langid = languageid;
            trace("LanguageEvent: " + this.langid);
        }

        public var langid:String;

        override public function clone():Event {
            return new LanguageEvent(type, langid);
        }
    }
}

调度:

private function functionOne():void
{       
    try{
        dispatchEvent(new LanguageEvent(LanguageEvent.LANGUAGE_SELECTED,"STR"));
    }
    catch(e:Error)
    {
        trace(e.message);
    }
}

在Main应用程序类中,EventListener:

protected function application1_initializeHandler(event:FlexEvent):void
{
  this.addEventListener(LanguageEvent.LANGUAGE_SELECTED,
 application1_LanguageSelectionHandler);
}

事件处理函数:

public function application1_LanguageSelectionHandler(event:LanguageEvent):void
{
    trace("application1_LanguageSelectionHandler: " + event.langid);
    populate_countrya3id_languages(event.langid);
}

1 个答案:

答案 0 :(得分:3)

您的代码看起来很好。由于我看不到完整的来源,以下是我对可能发生的事情的两点看法:

  1. 在发送活动之前,您确定addEventListener来电已完成吗?添加一些跟踪以确保在application1_initializeHandler之前打印functionOne

  2. 您的functionOne来电是否与您的主要应用程序不同?如果是这样,您需要在活动的超级通话中将自定义活动的bubbles属性设置为true。

     public function LanguageEvent(type:String,languageid:String,bubbles:Boolean=True)
     {
        super(type, bubbles);
        this.langid = languageid;
        trace("LanguageEvent: " + this.langid);
     }
    
  3. 有关构造函数调用,请参阅flash.events.Event文档。另外,这里引用了bubbles解释here的参数:

      

    bubbles属性

         

    据说一个事件会冒泡   事件对象参与   事件流的冒泡阶段,   这意味着事件对象是   从目标节点返回   通过它的祖先直到它到达   舞台。 Event.bubbles属性   存储一个指示的布尔值   事件对象是否参与   在冒泡阶段。因为全部   泡沫也参与的事件   捕获和目标阶段,任何   泡沫参与所有活动   三个事件流程阶段。如果   值为true,即事件对象   参与所有三个阶段。如果   值为false,即事件对象   不参与冒泡   相。

    根据您的源代码,您似乎已经在Flex文档中看到了“调度自定义事件”,但我会链接到它,以便将来/简单参考:http://livedocs.adobe.com/flex/3/html/help.html?content=createevents_3.html

    另外,请查看http://www.adnandoric.com/2008/12/29/understanding-the-flex-event-propagation/,了解事件传播系统的高级概述,以便更好地了解开发过程中发生的情况。

    修改

    根据您的评论我猜测您的functionOne调用是在一个单独的类中,而您的“主”应用程序有一个此类的实例。如果是这样,您将要在该实例上附加您的事件监听器并将其委托给您的主要application1_LanguageSelectionHandler函数...就像这样:

    protected function application1_initializeHandler(event:FlexEvent):void
    {
      this.theInstanceThatHoldsYourFunctionOne.addEventListener(LanguageEvent.LANGUAGE_SELECTED,
     application1_LanguageSelectionHandler);
    }