Как добавитьEventListener в пользовательский класс actionscript? - PullRequest
1 голос
/ 10 сентября 2011

У меня есть класс ActionScript MyClass, который расширяет NavigatorContent. Я создаю экземпляр класса как пользовательский компонент MXML NavigatorContnent для компонента Accordion. В 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));
    }
  }
}

Отсюда у меня есть экземпляр компонента, вложенный в Аккордеон. Я почти уверен, что проблема в этом определении класса, потому что, когда я устанавливаю точку останова в 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 ]

2 голосов
/ 10 сентября 2011

Вы добавили метаданные в определение класса

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

, поэтому все, что вам нужно сделать в mxml - это

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

В AS3 вы добавляете прослушиватель событий с помощью

myClass.addEventListener("selectEvent", event_handler);

PS Вашему классу придется расширить EventDispatcher

1 голос
/ 15 сентября 2013

В случае, если кому-то нужна реальная диспетчеризация события Actionscript-3, >>> >>> 1001 * это <<< очень полезно.Я не знаю, действительно ли это медленно, но соответствует стандартам AS-3. </p>

1 голос
/ 10 сентября 2011

Ваш класс должен либо расширить класс DisplayObject, либо напрямую наследовать от EventDispatcher, чтобы иметь возможность использовать события.Забудьте о реализации IEventDispatcher, поскольку где-то есть специальный кусок черного кода, который означает, что EventDispatcher - единственный класс, который может установить свойство target класса Event (я пробовал это раньше).

Рассмотрите возможность использования других альтернатив.События во 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, все еще могут добавлять прослушиватели событий и события отправки).Он также быстрее и занимает меньше места в памяти.

...