Событие Flex сработает только один раз - PullRequest
2 голосов
/ 12 октября 2009

В приложении AIR у меня есть приватная переменная и сеттер:

private var _saveResult
public function set saveResult( result:String ):void
{
    _saveResult = result;
    dispatchEvent( new resultUpdatedEvent( _saveResult ));
}

В первый раз, когда я установил «saveResult», событие срабатывает. Но он никогда не сработает, если я не перезапущу приложение.

Если я изменю сеттер на:

public function set saveResult( result:String ):void
{
    _saveResult = result;
    if ( result != null)
    {
        dispatchEvent( new resultUpdatedEvent( _saveResult ));
    }
}

Проблема исчезла, я могу установить переменную много раз, и событие происходит каждый раз.

Мой вопрос:

Я что-то здесь не так делаю? Если нет, может кто-нибудь объяснить мне, что происходит? Если да, то что я должен делать?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 12 октября 2009

Похоже, вы неправильно строите свое событие. Первый параметр объекта Event всегда должен быть строкой. Так что в этом случае вы бы хотели всегда использовать одну и ту же строку, чтобы вы могли прослушивать событие. Как выглядит ваш класс resultUpdatedEvent? Вы хотите, чтобы это выглядело примерно так:

package myEvents
{
    import flash.events.Event;

    public class PropertyChangeEvent extends Event
    {
        public static const PROPERTY_CHANGE:String = "propertyChange";

        public var result:String = "";

        // Public constructor.
        public function PropertyChangeEvent (type:String, 
            result:String="") {
                // Call the constructor of the superclass.
                super(type);

                // Set the new property.
                this.result= result;
        }


        // Override the inherited clone() method.
        override public function clone():Event {
            return new PropertyChangeEvent(type, result);
        }
    }
}

Таким образом, когда вы отправляете событие, вы можете построить событие следующим образом:

new PropertyChangeEvent(PropertyChangeEvent.PROPERTY_CHANGE, result);

Таким образом, вы слушаете событие «PropertyChangeEvent.PROPERTY_CHANGE», которое никогда не меняется. Теперь проблема заключается в том, что ваш прослушиватель событий, вероятно, прослушивает событие, представленное строкой, сохраненной в результате, и, очевидно, это меняется после того, как он установлен в первый раз, поэтому нет способа назначить ему прослушиватель.

Для получения дополнительной информации о том, как события работают в AS3: http://livedocs.adobe.com/flex/3/html/help.html?content=events_02.html

1 голос
/ 13 октября 2009

За комментарии ... Не было проблем с диспетчером событий. Я неправильно диагностировал проблему, РЕАЛЬНАЯ проблема заключалась в том, что если у вас есть свойство [Bindable] и вы используете установщик, и вы устанавливаете его в качестве текущего значения, flex его игнорирует. Итак, у вас есть несколько вариантов:

1) дайте геттеру и сеттеру разные имена. Похоже на «плохую идею», но это решает проблему.

2) удалить [Bindable] из класса (моя проблема) или свойства. Если класс не реализует IEventDispatcher, вам необходимо это сделать. Вы можете просто «расширить Sprite», чтобы увидеть, как он работает, но это кажется «плохой идеей» в качестве решения, поэтому я реализовал IEventDispatcher для примера в конце этой страницы: http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/events/IEventDispatcher.html

3) Я уверен, что есть способ обойти эту ошибку, но на самом деле мне НЕ НУЖЕН, чтобы класс был [Bindable], поэтому я не нашел обходного пути.

...