Форум 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=115381)

jack_the_ripper 28.08.2008 10:41

Транслировать событие
 
Есть два класса, хотелось бы,чтобы один класс передавалсобытие во второй,а тот спомощью EventListener'а его прослушивал. Как это сделать?

etc 28.08.2008 10:52

Прочитать доку по EventDispatcher и посмотреть примеры.

enepx 28.08.2008 11:00

В первый класс передайте ссылку на второй. В первом генеряйте Event, а во втором установите слушателя на первый класс по ссылке:
Код:

firstClassRef.addEventListener(...);

BlooDHounD 28.08.2008 12:07

enepx, а зачем первому ссылка на второй?

tyapichu 28.08.2008 12:42

там, наверное, не ссулку надо а addChild'ом второй объект на первый положить

enepx 28.08.2008 13:21

Цитата:

Сообщение от BlooDHounD (Сообщение 760719)
enepx, а зачем первому ссылка на второй?

Я имею в виду передавать одному объекту ссылку на другой.
Цитата:

Сообщение от tyapichu (Сообщение 760725)
там, наверное, не ссулку надо а addChild'ом второй объект на первый положить

Это не верно. Объекты - это же не обязательно графика от DisplayObject'а, а все что угодно. Плюс это может не удовлетворять ООД проекта.

BlooDHounD 28.08.2008 13:43

enepx, мне как-то всё равно что и когда Вы имеете, просто разные части ваших предложений часто говорят о противоположных вещах.

etc 28.08.2008 20:08

Цитата:

Сообщение от enepx (Сообщение 760746)
Я имею в виду передавать одному объекту ссылку на другой.

Это понятно. Зачем первому классу ссылка на второй?

enepx 28.08.2008 20:16

Цитата:

Сообщение от __etc (Сообщение 760903)
Это понятно. Зачем первому классу ссылка на второй?

Да Господи...
Ошибся я, надо наоборот: во второй класс передать ссылку на первый! Если прочесть код моего поста, то там ошибки нет.

CrazyFlasher 28.08.2008 20:19

просто передать обычным сеттером, если я правильно понял...только вот зачем? можно использовать обычный dispatchEvent, что придаёт независимость классам.

enepx 28.08.2008 20:28

Цитата:

Сообщение от CrazyFlasher (Сообщение 760911)
просто передать обычным сеттером, если я правильно понял...только вот зачем? можно использовать обычный dispatchEvent, что придаёт независимость классам.

Когда я говорил "генерять Event", я имел в виду "использовать обычный dispatchEvent".

CrazyFlasher 28.08.2008 20:31

так чё надо сделать-то? вас непонятно...какой конкретный конечный результат должен быть?

BlooDHounD 28.08.2008 20:50

CrazyFlasher, что Вы пристали :) как вы подпишитесь на событие первого класса, во втором не имея доступа, к первому?

enepx 28.08.2008 20:55

код
 
я понял задачу так, может и не верно:

Main:
Код:

public class Main extends Sprite
{
        public function Main() {
                var objectOne:ClassOne = new ClassOne();
                var objectTwo:ClassTwo = new ClassTwo(objectOne);
               
                var sampleEvent:Event = new Event(Event.OPEN);
                objectOne.generateEvent(sampleEvent);
        }
}

ClassOne:
Код:

public class ClassOne extends EventDispatcher
{
        public function generateEvent(event:Event):void {
                dispatchEvent(event);
        }
}


ClassTwo:

Код:

public class ClassTwo
{
        public function ClassTwo(classOneRef:ClassOne) {
                classOneRef.addEventListener(Event.OPEN, onEventReceive);
        }
       
        private function onEventReceive(event:Event):void {
                trace(event);
        }
}


BlooDHounD 28.08.2008 21:05

enepx, а зачем метод generateEvent?

Felicast 28.08.2008 21:08

2 enepx: господа _etc и BlooDHounD имеют ввиду что перредавать objectOne вовсе необязательно. так теряется смысл использования рассылки событий: можно просто заместо обработчика использовать обычную функцию.

enepx 28.08.2008 21:13

Цитата:

Сообщение от Felicast (Сообщение 760928)
2 enepx: господа _etc и BlooDHounD имеют ввиду что перредавать objectOne вовсе необязательно. так теряется смысл использования рассылки событий: можно просто заместо обработчика использовать обычную функцию.

т.е. что-то типа
Код:

public class Main extends Sprite
{
        public function Main() {
                var objectOne:ClassOne = new ClassOne();
                var objectTwo:ClassTwo = new ClassTwo();

                objectOne.addEventListener(Event.OPEN, objectTwo.onEventReceive);
        }
}

?

BlooDHounD 28.08.2008 21:21

enepx, а давно в addEventListener, первым аргументом идёт Event, а не String?

enepx 28.08.2008 21:39

Поправил. спасибо.
Так верно (я про идею) ?

tyapichu 28.08.2008 22:11

в хелпе вроде не рекомендовалось использовать в качестве второго аргумента листенера функции из других классов. и все равно придется написать addChild(objectOne); иначе ивент не будет проходить через main.

enepx 28.08.2008 22:24

Я не понимаю зачем так писать. ClassOne даже не DisplayObject, как его можно добавить?

BlooDHounD 28.08.2008 22:56

tyapichu, учите матчасть.
enepx, и всё-таки мне казалось в первый итерациях вашей идеи было нечто вроде:
Код:

public class Main extends Sprite {
        public function Main() {
                var objectOne:ClassOne = new ClassOne();
                var objectTwo:ClassTwo = new ClassTwo( objectOne ); // UPD. поправил. было this
                objectOne.open();
        }

}

Код:

public class ClassOne extends EventDispatcher {

        public function open():void {
                super.dispatchEvent( new Event( Event.OPEN ) );
        }

}

Код:

public class ClassTwo {

        public function ClassTwo(classOneRef:ClassOne) {
                classOneRef.addEventListener(Event.OPEN, handler);
        }
       
        private function handler_open(event:Event):void {
                trace(event);
        }

}

P.S.: enepx, начните наконец, запоминать что пишете в начале предложения, когда заканчиваете его. или перечитывайте.

enepx 28.08.2008 23:03

Цитата:

Сообщение от BlooDHounD (Сообщение 760947)
P.S.: enepx, начните наконец, запоминать что пишете в начале предложения, когда заканчиваете его. или перечитывайте.

Хорошо. Учту.

tyapichu 29.08.2008 00:32

Цитата:

Сообщение от BlooDHounD (Сообщение 760947)
tyapichu, учите матчасть.

наверное, я что-то совсем не так делаю, но ловить листенерами ивенты, которые диспатчатся в объектах, не добавленных через addChild, у меня не получалось :( добавлял через addChild и все сразу работало. там есть какие-то особенные условия работы без addChild?


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

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