2010-08-11 123 views
1

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

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); 
    } 
} 

在主应用程序类,事件监听:

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); 
} 

回答

3

你的代码看起来不错。既然不能看到完整的源代码,这里有我什么两个念头可能正在进行:

  1. 你确定你发送的事件之前,您addEventListener调用完成?添加一些痕迹以确保在functionOne之前打印application1_initializeHandler

  2. 你的functionOne调用另一个不同于你的主应用程序的组件吗?如果是这样,您需要在事件的超级通话中将自定义事件的bubbles属性设置为true。

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

flash.events.Event文档的构造函数调用。此外,这里有一个报价有关bubbles参数解释here:这意味着

气泡属性

如果 事件对象在事件流的 冒泡阶段参与的事件是对气泡所述, 事件对象是 ,通过它的祖先从目标节点返回 ,直到达到舞台的 。 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); 
} 
+0

“的addEventListener”的事件被分派前执行。我已跟踪测试过。 正如你怀疑“functionOne”在主应用程序以外的其他类中。正如你所建议的那样,我在超级类的构造函数中添加了“bubbles = true”。但它仍然不起作用。我将通过您提供的链接并尝试更多的调试。 :) – Saneef 2010-08-11 19:45:06

+1

@Saneef:根据你的评论我已经更新了我的答案......看看它是否能为你解决。 – sdolan 2010-08-11 19:53:15

+0

@sdolan它的工作。 :) 谢谢!现在,即使将事件侦听器添加到主应用程序(就像我之前所做的那样),我仍然怀疑,在事件传播(如adnandoric.com中显示的事件传播)中不会调用它吗? – Saneef 2010-08-11 20:11:33