2010-08-11 2 views
1

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

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

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

В главном классе приложения, 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); 
} 

ответ

3

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

  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 аргумент объяснил here:

Пузырьки свойству

Событие, как говорят пузырь, если его объект события участвует в пузырьковой фазы потока событий, что означает что объект события прошел от целевого узла назад через своих предков, пока не достигнет Этап. Свойство Event.bubbles хранит логическое значение, которое указывает , участвует ли объект события в фазе барботажа. Потому что все события, которые пузырьки также участвуют в фазах захвата и цели, любое событие , что пузырьки принимают участие во всех трех фазах потока событий. Если значение истинно, объект события участвует во всех трех фазах. Если значение равно 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); 
} 
+0

«addEventListener» для события выполняется перед отправкой. Я проверил со следами. Поскольку вы сомневаетесь, что «functionOne» находится в другом классе, отличном от основного приложения. Я добавил «bubbles = true» в конструкторе суперкласса, как вы предложили. Но все же он не работает. Я просмотрю ссылки, которые вы предоставили, и попробуйте отладить больше. :) – Saneef

+1

@Saneef: Основываясь на вашем комментарии, я обновил свой ответ ... проверьте его и посмотрите, разрешит ли он его вам. – sdolan

+0

@sdolan Это сработало. :) Спасибо! Теперь у меня есть сомнения, даже если я добавлю прослушиватель событий к основному приложению (например, я сделал это раньше), не будет ли это вызвано во время распространения события, как показано на adnandoric.com? – Saneef

Смежные вопросы