Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Общее событие (http://www.flasher.ru/forum/showthread.php?t=215774)

djken 17.05.2020 15:26

Общее событие
 
Всем привет.
Есть класс BlackList, Slide, Moderation.
Внутри Slide по нажатию на кнопку вызываю метод в BlackList, в котором диспатчится событие.
Это событие хочу ловить в этом же классе Slide и в Moderation для дальнейшей обработки. Для этого в Slide и в Moderation создан экземпляр класса BlackList со слушателями.

Почему событие может не ловиться внутри Moderation? (догадки пока, что в каждом созданном экземпляре BlackList события независимы друг от друга..)

Для наглядности набросал пример:

Главный класс Main
Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class Main extends Sprite
        {
                private var _window:Window;
                private var _list:List;
 
                public function Main()
                {
                        _window = new Window();
                        addChild(_window);
 
                        _list = new List();
                        _list.addEventListener(List.CHANGE, onChangeList);
                }
 
                private function onChangeList(event:Event):void
                {
                        trace('Main > LIST CHANGED'); // этот обработчик события не срабатывает
                }
        }
}

Дочерний класс Window, который вложен в Main
Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
 
        public class Window extends Sprite
        {
                private var _btn:Sprite;
                private var _list:List;
 
                public function Window()
                {
                        _btn = new Sprite();
                        _btn.graphics.beginFill(0x0000FF);
                        _btn.graphics.drawRect(0,0,50,50);
                        _btn.graphics.endFill();
                        _btn.x = _btn.y = 20;
                        addChild(_btn);
 
                        _btn.addEventListener(MouseEvent.CLICK, onClickBtn);
 
                        _list = new List();
                        _list.addEventListener(List.CHANGE, onChangeList);
                }
 
                private function onClickBtn(event:MouseEvent):void
                {
                        _list.add();
                }
 
                private function onChangeList(event:Event):void
                {
                        trace('Window > LIST CHANGED'); // здесь срабатывает
                }
        }
}


И класс List, который генерит событие при нажатии на кнопку внутри Window
Код AS3:

package
{
        import flash.events.Event;
        import flash.events.EventDispatcher;
 
        public class List extends EventDispatcher
        {
                public static const CHANGE:String = 'change';
 
                public function List()
                {
 
                }
 
                public function add():void {
                        dispatchEvent(new Event(CHANGE));
                }
        }
}

Почему не получается поймать событие в главном классе Main ?? Потому что событие закреплено на уровне каждого экземпляра, а не на уровне класса List?

Wolsh 18.05.2020 11:11

Экземпляр Moderation находится в DisplayList?

djken 18.05.2020 18:54

Wolsh, добавил в вопросе пример скрипта для наглядности. Почему в классе Main не отлавливается событие?

Godwarlock 18.05.2020 21:58

Смею предположить, что у тебя List в Main и List в Window, это два разных объекта. List из main, ничего не знает о list из Window, который вызывает add и ловит событие.

djken 19.05.2020 00:13

Godwarlock, понял, спасибо.

В целом разобрался. Решил сделать так: при инициализации приложения в модели, где хранятся все данные в статических переменных, создать объект класса List. И везде, где нужно подписаться на его события, создаю экземпляр List ссылающийся на List из модели. Все работает


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

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