Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Не выполняется диспетчеризация dispatchEvent (http://www.flasher.ru/forum/showthread.php?t=204387)

dendead 28.10.2013 17:28

Не выполняется диспетчеризация dispatchEvent
 
Доброго времени суток.
Никак не могу разобраться почему не выполняется диспетчеризация пользовательского события...

Есть класс Class1, который расширяет EventDispatcher:
Код AS3:

package test {
        import flash.events.*;
        public class Class1 extends EventDispatcher {
          public static const NEW:String = "NEW";                // создаю константу с именем события
 
          public function Class1( ) {
          }
 
          public function testFunc( ):void {                          // функция, которая вызывается в третьем классе
              dispatchEvent(new Event(Class1.NEW));          // диспетчеризация события
          }
        }
}

Также есть класс Class2, который отвечает за отображение объектов на экране и расширяет Sprite:
Код AS3:

package test {
        import flash.events.*;
        import flash.display.*;
        public class Class2 extends Sprite {
          private var class1:Class1;
 
          public function Class2( ) {
              class1 = new Class1( );                                            // создаю экземпляр класса class1
              addUserListeners( );
          }
 
          public function addUserListeners( ):void {
              class1.addEventListener(Class1.NEW, newListener)// регистрирую приёмник в экземпляре класса
          }
 
          public function newListener(e:Event):void {
                trace("Вызов прошёл!");
          }
        }
}

И собственно, третий класс, в котором выполняется функция testFunc( ) и успешная диспетчеризация нескольких других событий:
Код AS3:

package test {
        import flash.events.*;
        public class Class3 extends EventDispatcher {
          private var class1:Class1;
 
          public function Class3( ) {
              class1 = new Class1( );
              test( );
          }
 
          public function test( ) { 
              class1.testFunc( );                             
          }
          // дальше выполняется успешная диспетчеризация других событий, код не показан
        }
}

В итоге не выполняется диспетчеризация Class1.NEW. Функция при это выполняется без проблем testFunc( ). Совсем запутался. Подскажите пожалуйста в чём может быть дело.

gloomyBrain 28.10.2013 17:33

Вы в коде Class2 подписываетесь на событие, а в коде Class3 вызываете диспетчеризацию. Посмотрите внимательно, у Вас и там и там создается новый объект класса Class1 (new Class1). Это разные объекты. Поэтому получается что Вы ждете событие от одного объекта (созданного в конструкторе Class2), а событие отправляете из другого (созданного в конструкторе Class3)

dendead 28.10.2013 17:49

Действительно разные...
В классе Class3 создаю экземпляр класса Class1 для доступа к методу экземпляра testFunc( ), а в классе Class2 экземпляр Class1 использую для регистрации приёмника...

Тогда в каком объекте регистрировать приёмник, если диспетчеризация должна проходить непосредственно в Class1?

Пробовал сохранять текущую ссылку через this.class1 = class1, но безрезультатно.

Akopalipsis 28.10.2013 17:59

Вам как минимум нужно создать первым Class1 и передать на него ссылки в другие классы при их инициализации.

dendead 28.10.2013 18:08

В классе Class2 переменной class1 присвоил значение class1 класса Class3. И всё заработало.

gloomyBrain, спасибо за помощь!

Добавлено через 1 минуту
Цитата:

Сообщение от Akopalipsis (Сообщение 1150168)
Вам как минимум нужно создать первым Class1 и передать на него ссылки в другие классы при их инициализации.

Я опустил значительную часть кода в описании.

Котяра 29.10.2013 01:15

Листенеры вешаются не на класс, а на экземпляры.


Часовой пояс GMT +4, время: 20:17.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.