如何将addEventListener添加到自定义actionscript类?

时间:2011-09-10 02:18:01

标签: flex actionscript-3 actionscript mxml

我有一个可以扩展NavigatorContent的actionscript类MyClass。我将该类实例化为Accordion组件的自定义MXML NavigatorContnent组件。 MyClass有一个我试图附加事件监听器的Button组件。我想让事件冒泡,以便我可以在Accordion组件中使用处理程序。

MyClass的

package comp
{

  import flash.events.Event;
  import flash.events.MouseEvent;

  [Event(name="selectEvent", type="flash.events.Event")]

  public class MyClass extends NavigatorContent
  {

    public function MyClass()
    {
      super();
      btnSelect.addEventListener(MouseEvent.CLICK, selectClickDispatcher);
    }


    public function selectClickDispatcher(event:MouseEvent):void
    {
      event.currentTarget.dispatchEvent(new Event("selectEvent",true));
    }
  }
}

从这里我将实例化的组件嵌套在Accordion中。我很确定问题出在这个类定义中,因为当我在selectClickHandler上设置断点时,代码不会中断。如果我错了,我会发布其余的组件。

名为MySubComp.mxml的自定义组件

<comp:MyClass
    ...I have a few more spark components here and nothing else...
/>

手风琴

<mx:Accordion>

    <fx:Script> //omitted CDATA tags to save space
        protected function selectEventHandler(event:Event):void
        {
            Alert.show("Value Selected");   
        }
    </fx:Script>

        //custom components are in the navs package
        <navs:MySubComp selectEvent = "selectEventHandler(event)"/>

</mx:Accordion>

3 个答案:

答案 0 :(得分:2)

您已将元数据添加到类定义

[Event(name="selectEvent", type="flash.events.Event")]

所以你需要在mxml中做的只是

<comp:MyClass selectEvent="event_handler(event)"
..... />

在AS3中,您可以通过

添加事件监听器
myClass.addEventListener("selectEvent", event_handler);

P.S。您的课必须扩展EventDispatcher

答案 1 :(得分:1)

您的课程要么需要扩展DisplayObject类,要么直接从EventDispatcher继承,以便能够使用事件。忘记实现IEventDispatcher因为某处有一段特殊的黑色代码,这意味着EventDispatcher是唯一可以设置target类的Event属性的类(I')我以前试过了。)

考虑使用其他替代方案。 Flash中的事件往往很慢并且一直在创建对象。如果你需要简单的东西,回调是一个很好的系统。

public class A
{
    public var onSomething:Function = null;
    public function foo():void
    {
        if( this.onSomething != null )
            this.onSomething();
    }
}

public class B
{
    public function B()
    {
        var a:A = new A;
        a.onSomething = this._somethingCalled; // set the callback
        a.init();
    }

    private function _somethingCalled():void
    {
        trace( "hello there" );
    }
}

您还可以查看信号项目:https://github.com/robertpenner/as3-signals/wiki

信号远远优于普通Flash事件,并且对可以使用它们的对象类型没有限制(即非DisplayObject对象仍然可以添加事件侦听器和调度事件)。它也更快,内存占用更少。

答案 2 :(得分:1)

如果有人需要使用真实的Actionscript-3事件调度&gt;&gt;&gt; this&lt;&lt;&lt;非常有帮助。我不知道它是否真的很慢但它符合AS-3标准。