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

pomuс 24.01.2013 13:27

собственный слушатель событий
 
Приветствую!
Возникла потребность в отсылке событий между классами. А именно- есть класс в котором грузятся xml данные, и далее они распределяются по массивам.
В другом же классе мне надо поймать это событие распределения в массивы, и использовать данные массивов. А сейчас получается так, что этот класс сразу взял эти массивы, но они то пустые, и еще не заполнены.
Так вот, почитал я про собственные события, сделал как писал Мук.

в классе загрузки xml в функции распределения данных по массивам прописал

Код AS3:

private function arrayFill(value:XML):void {
                        xmlData = value as XML;
                        var xmlList:XMLList = xmlData.children();
                        for (var i:int=0; i<xmlList.length(); i++) {
                                var picID:String = xmlList[i].@id;
                                idArr.push(picID);       
 
                                dispatchEvent(new Event ("arrLoaded"));
                        }
                }

в конструкторе класса, где нужно воспользоваться массивом прописал
Код AS3:

this.addEventListener("arrLoaded", getArr);

ну и далее сама функция обработки
Код AS3:

public function getArr(e:Event):void {
                        trace (Page.idArr);
                }

ошибок не выдает, но массив не обрабатывается
В чем проблема, подскажите пожалуйста

strangedk 24.01.2013 13:52

1. Возможно нужно вынести dispatchEvent из цикла for
2. что такое idArr?
3. что такое Page ?

expl 24.01.2013 13:55

Цитата:

в конструкторе класса, где нужно воспользоваться массивом прописал
Насколько я понял, Вы подписываетесь на событие "arrLoaded" у класса, который его не распространяет.
Надо подписываться не у this, а у объекта, который делает dispatchEvent(new Event ("arrLoaded"));

pomuс 24.01.2013 13:58

Цитата:

Сообщение от strangedk (Сообщение 1117477)
1. Возможно нужно вынести dispatchEvent из цикла for
2. что такое idArr?
3. что такое Page ?

1- не помогло
2- idArr это public static idArr:Array
3- Page это класс, где обрабатывается xml и заполняется массив

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

СлаваRa 24.01.2013 13:59

каким образом происходит подписка класса A на событие, которое отправляет класс B?

strangedk 24.01.2013 14:02

Цитата:

Сообщение от pomuс (Сообщение 1117480)
1- не помогло
2- idArr это public static idArr:Array
3- Page это класс, где обрабатывается xml и заполняется массив

Так а что вы тогда хотите увидеть в Page.urlArr, если у вас заполняется массив idArr

pomuс 24.01.2013 14:08

СлаваRа в смысле? я же вроде указал это в самом первом посте. Событие создается в классе А по завершению заполнения, а в классе В вешается слушатель.
strangedk там всего 3 массива, в том числе urlArr и idArr. Просто сократил код, и удалил не то, поправил

p.s. может я не понимаю какой то концептуальной вещи?

caseyryan 24.01.2013 14:12

Возможно слушатель добавялется уже после отработки кода с отсылкой события.
Да, и кстати, вот этот код
Код AS3:

trace (Page.idArr);

ничего не покажет в трейсе, если массив пустой.
Так что хотя бы какую-то строку надо добавить, чтобы убедиться что трейс срабатывает вообще
Код AS3:

trace ("ARRAY:", Page.idArr);


pomuс 24.01.2013 14:21

caseyryan так, ну на то же он и слушатель, разве нет? к примеру если я вешаю слушатель на кнопку, естественно что он вешается, и потом слушает это событие клика, например.

Кстати сделала трейс указали- не выводится ничего, - следовательно событие не проходит

СлаваRa 24.01.2013 14:22

Код AS3:

package {
        import flash.display.Sprite;
        import flash.events.Event;
 
        /**
        * @author SlavaRa
        */

        public class Main extends Sprite {
 
                public function Main():void {
                        super();
                        if (super.stage) {
                                this.onSuperAddedToStage();
                        } else {
                                super.addEventListener(Event.ADDED_TO_STAGE, this.onSuperAddedToStage);
                        }
                }
 
                private function onSuperAddedToStage(e:Event = null):void {
                        super.removeEventListener(Event.ADDED_TO_STAGE, this.onSuperAddedToStage);
                        // entry point
                        var a:A = new A();
                        var b:B = new B(a);
                        a.setArray([1, 2, 3, 4]);
                }
 
        }
 
}
 
import flash.events.Event;
import flash.events.EventDispatcher;
 
class A extends EventDispatcher {
        public function A() {
                super();
        }
 
        private var _array:Array;
 
        public function setArray(array:Array):void {
                this._array = array;
                super.dispatchEvent(new Event(Event.COMPLETE));
        }
 
        public function get array():Array {
                return _array;
        }
}
 
class B {
        public function B(a:A) {
                super();
                this._a = a;
                this._a.addEventListener(Event.COMPLETE, onAComplete);
        }
 
        private var _a:A;
 
        private function onAComplete(event:Event):void {
                trace("array:", this._a.array); //array: 1,2,3,4
        }
}

у меня все работает


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

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