Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   displayObject removeAllListeners (http://www.flasher.ru/forum/showthread.php?t=146172)

inozemcev 30.10.2010 17:40

displayObject removeAllListeners
 
Требуется написать универсальную функцию, которая отписывает объект от каких либо оповещений. Можно ли это сделать каким то стандартным образом. Быть может есть какой то список с событиями, на который подписался объект. Или придется тупо спрашивать его о листенерах через hasEventListener ?!

f.g.programmer 30.10.2010 17:55

hasEventListener бесполезен, он только скажет, что обработчик есть.
В отписке нужно указывать не только тип, но и обработчик события, а для всплывающих ещё и флаг перехвата.
Список есть, но доступа к нему нет :)

Нативных решений нет но есть различные менеджеры событий, работающие через наследование, композицию или как глобальные.

inozemcev 30.10.2010 18:17

Есть такая функция describeType, которая возвращает xml описание объекта. Я ее использовал, чтобы обходить свойства экземпляров классов, потому, что не все экземпляры можно обойти с помощью цикла for. Может быть в нем есть этот лист ?

Добавлено через 1 час 26 минут
Вообщем с помощью метода flash.sampler.getMemberNames удалось добраться до массива с листенерами:

Код AS3:

public static function removeAllListeners (object:Object) :void
{
        var members:Object = getMemberNames(object);
        for each (var prop:QName in members)
        {
                if (prop.localName == 'listeners')
                {
                        var arr:Array = object[prop];
                }
        }
}

Осталось теперь вытащить тип события (event.type) и можно отписывать.

Грубо говоря есть функция, нужно вытащить тип принимаемого параметра.

Добавлено через 11 часов 38 минут
заебался рыться, пришлось написать свой спрайт

Код AS3:

package presentsimple.display 
{
        import flash.display.Sprite;
 
        /**
        * ...
        * @author sergey kostin (inozemcev);
        */

        public class Sprite extends flash.display.Sprite
        {
                private var _listeners:Vector.<EventDispatcherItem>;
 
                override public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
                {
                        var item:EventDispatcherItem = new EventDispatcherItem (type, listener, useCapture);
                        listeners.push (item);
                        super.addEventListener(type, listener, useCapture, priority, useWeakReference);
                }
 
                override public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void
                {
                        super.removeEventListener(type, listener, useCapture);
                        var item:EventDispatcherItem = getListener (type, listener, useCapture);
                        if (item)
                        {
                                listeners.splice (listeners.indexOf(item), 1);
                        }
 
                }
 
                private function get listeners () :Vector.<EventDispatcherItem>
                {
                        if (!_listeners) _listeners = new Vector.<EventDispatcherItem> ();
                        return _listeners;
                }
 
                public function removeTypeListeners (type:String) :void
                {
                        for each (var handler:EventDispatcherItem in listeners)
                        {
                                if (handler.type == type)
                                {
                                        removeEventListener (handler.type, handler.listener, handler.useCapture)
                                }
                        }
                }
 
                public function removeAllListeners () :void
                {
                        while (listeners.length)
                        {
                                var handler:EventDispatcherItem = listeners.shift ();
                                removeEventListener (handler.type, handler.listener, handler.useCapture)
                        }
                }
 
                private function getListener (type:String, listener:Function, useCapture:Boolean = false):EventDispatcherItem
                {
                        var item:EventDispatcherItem;
                        for each (var handler:EventDispatcherItem in listeners)
                        {
                                if (handler.type == type && handler.listener == listener && handler.useCapture == useCapture)
                                {
                                        item = handler;
                                        return item;
                                }
                        }
 
                        return item;
 
                }
 
 
        }
public class EventDispatcherItem
        {
                public var type:String;
                public var listener:Function;
                public var useCapture:Boolean;
 
                public function EventDispatcherItem(type:String, listener:Function, useCapture:Boolean)
                {
                        this.type = type;
                        this.listener = listener;
                        this.useCapture = useCapture;
                }
 
        }
 
}



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

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