Гибкие часы привязываемого свойства другого класса

Я создаю приложение с помощью Flex 4. Когда приложение запускается, оно читает файл XML и заполняет объекты. Вызов.send() является асинхронным, поэтому я хотел бы прослушать / посмотреть этот заполненный объект, а когда он закончится, отправить событие для других классов, чтобы они могли его использовать.

package model{
    public class LectureService extends HTTPService{
        [Bindable]
        private var _lecture:Lecture;

        ...
}

XML анализируется правильно и загружается в объектную лекцию класса Lecture.

Если я использую нотацию MXML в приложении main.mxml, она работает нормально (объект используется, когда он заполняется после асинхронного запроса):

<mx:Image id="currentSlide" source={lectureService.lecture.slides.getItemAt(0).path} />

НО, у меня есть другой класс ActionScript, и я не могу прослушать это отправленное (посредством [Bindable]) событие.

package components{

    public class LectureSlideDisplay extends Image
    {       
        public function LectureSlideDisplay()
        {
            super();

            this.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, onChangeTest);
        }

        private function onChangeTest(e:PropertyChangeEvent):void {
            trace('test');
        }

Я уже попробовал:

  1. используя (как выше) addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, methodName).
  2. попытался изменить [Bindable] на [Bindalbe("nameEvent")] и прослушать это, ничего.
  3. используя метод CreateWatcher, не работает.
  4. попытался взглянуть на сгенерированный код класса, но мне не помогло

    if (this.hasEventListener("propertyChange")){ this.dispatchEvent(mx.events.PropertyChangeEvent.createUpdateEvent(this, "lecture", oldValue, value)); }

Как я могу слушать и иметь заполненный объект в другом классе? Может быть, проблема в том, что я слушаю из другого класса, но в этом случае, как я могу это реализовать? Кажется, событие отправлено, но я не могу его слушать.

3 ответа

Решение

Подумайте об использовании BindingUtils учебный класс. Вы можете найти документацию здесь. И пара примеров использования: один, два.

Для тех, кто хочет получить ответ, я решил изменить объект addEventListener. Неправильно использовать:

this.addEventListener(...)

Используйте вместо:

lectureService.addEventListener(...)

Я изменил свой код для прослушивания этого события в основном приложении MXML, а затем внутри метода-обработчика вызову открытый метод ваших компонентов для использования новых данных.

Вы не можете решить все свои проблемы, просто расширяя класс. Вы действительно должны смотреть на команды для ваших HTTP-запросов.

Событие изменения свойства используется внутренне для наблюдателей и не будет отправлено в общий компонент. Что вы хотите сделать для своего LectureSlideDisplay это переопределить источник установки. Каждый раз, когда он вызывается, к нему привязывается новое значение:

package components{

    public class LectureSlideDisplay extends Image
    {      
        override public function set source(value:Object):void
        {
           super.source = value;
           // do whatever
        } 

        public function LectureSlideDisplay()
        {
            super();
        }
   }
}

Вы должны действительно прочитать о том, как работает Binding.

Другие вопросы по тегам