Обработчик событий Flex не работает - PullRequest
1 голос
/ 11 августа 2010

Я создал пользовательское событие в flex 3.5.Но обработчик не вызывается.Как решить эту проблему или как решить эту проблему?

Класс события:

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 application,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 Ответ

3 голосов
/ 11 августа 2010

Ваш код выглядит нормально. Поскольку я не вижу полного источника, вот мои две мысли о том, что может происходить:

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

См. Документы flash.events.Event для вызова конструктора. Кроме того, вот цитата об аргументе bubbles, объясненном здесь :

Свойство пузырей

Говорят, что событие вспыхивает, если его объект события участвует в пузырящаяся фаза потока событий, Это означает, что объект события передается от целевого узла обратно через своих предков, пока не достигнет Уровень. Свойство Event.bubbles хранит логическое значение, которое указывает участвует ли объект события в пузырчатой ​​фазе. Потому что все события, которые пузыри также участвуют в фазы захвата и цели, любые событие, которое пузырьки участвует во всех три этапа потока событий. Если Значение true, объект события участвует во всех трех этапах. Если значение false, объект события не участвует в барботировании фазы.

Исходя из вашего исходного кода, похоже, что вы видели «Диспетчеризацию пользовательских событий» в гибких документах, но я буду ссылаться на них в любом случае для дальнейшего / простого ознакомления: 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/ за кратким обзором системы распространения событий, чтобы попытаться лучше понять, что происходит во время разработки.

Edit:

Исходя из ваших комментариев, я предполагаю, что ваш functionOne вызов находится в отдельном классе, и у вашего "основного" приложения есть экземпляр этого класса. Если это так, вы захотите присоединить ваш прослушиватель событий к этому экземпляру и делегировать его функции application1_LanguageSelectionHandler вашего основного ... Вот так:

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