簡體   English   中英

如何將addEventListener添加到自定義actionscript類?

[英]How do I addEventListener to custom actionscript class?

我有一個可以擴展NavigatorContent的actionscript類MyClass。 我將該類實例化為Accordion組件的自定義MXML NavigatorContnent組件。 MyClass有一個我試圖附加事件監聽器的Button組件。 我想讓事件冒泡,以便我可以在Accordion組件中擁有處理程序。

我的課

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>

您已將元數據添加到類定義中

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

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

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

在AS3中,您可以添加事件偵聽器

myClass.addEventListener("selectEvent", event_handler);

PS您的課程必須擴展EventDispatcher

如果有人需要使用真正的Actionscript-3事件調度>>> 這對 <<<非常有幫助。 我不知道它是否真的很慢但它符合AS-3標准。

您的類要么需要擴展DisplayObject類,要么直接從EventDispatcher繼承,以便能夠使用事件。 忘記實現IEventDispatcher因為某處有一段特殊的黑色代碼,這意味着EventDispatcher是唯一可以設置Event類的target屬性的類(我之前嘗試過)。

考慮使用其他替代品。 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" );
    }
}

您還可以查看Signals項目: https//github.com/robertpenner/as3-signals/wiki

信號遠遠優於普通Flash事件,並且對可以使用它們的對象類型沒有限制(即非DisplayObject對象仍然可以添加事件偵聽器和調度事件)。 它也更快,內存占用更少。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM