Как запустить событие для массива push? [Вспышка] - PullRequest
0 голосов
/ 17 августа 2010

Как мне добавить addEventListener для объекта массива.

Я пытаюсь не запускать таймер каждые x миллисекунд для проверки новых элементов в объекте массива, а пытаюсь вызвать событие при обнаружении новых элементов для их обработки и удаления.

Возможно ли это с массивами? может быть ArrayCollections? либо в порядке.

P.S.> Это Flash вопрос не javascript

Ответы [ 4 ]

1 голос
/ 18 августа 2010

Почему бы не создать свой собственный класс массива, который расширяет Array и реализует IEventDispatcher, переопределяет функцию push () и заставляет ее отправлять событие при вызове функции?

Так что-то вроде:

package
{
    import flash.events.EventDispatcher;
    import flash.events.IEventDispatcher;

    public class MyArray extends Array implements IEventDispatcher
    {
        public static var ARRAY_PUSHED:String = "MYARRAY_ARRAY_PUSHED";

        private var dispatcher:EventDispatcher;

        public function MyArray(...parameters)
        {
            super(parameters);
            dispatcher = new EventDispatcher(this);
        }

        override public function push(...parameters):uint
        {
            dispatchEvent(ARRAY_PUSHED);
            super.push(parameters);
        }

        public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int=0, useWeakReference:Boolean=false):void
        {
            dispatcher.addEventListener(type, listener, useCapture, priority);
        }
        public function dispatchEvent(e:Event):Boolean
        {
            return dispatcher.dispatchEvent(e);
        }
        public function hasEventListener(type:String):Boolean
        {
            return dispatcher.hasEventListener(type);
        }
        public function removeEventListener(type:String, listener:Function, useCapture:Boolean=false):void
        {
            dispatcher.removeEventListener(type, listener, useCapture);
        }
        public function willTrigger(type:String):Boolean
        {
            return dispatcher.willTrigger(type);
        }
    }
}
0 голосов
/ 18 августа 2010
   private var myArray:Array;

   private function addToArray(element:Object):void
   {
        myArray.push(element);
        dispatch( new Event("Element added));
   }

или в статической функции, если вы хотите вызвать ее из другого класса

   public static function addToArray( array:Array , element:Object , dispatcher:EventDispatcher):Array
   {
       array.push(element);
       dispatcher.dispatch( new Event('Added Element') );
       return array;
   }

Реализация действительно зависит от вашей среды.

0 голосов
/ 17 августа 2010

найдено

 AS3 override function push(...args):uint
    {
        for (var i:* in args)
        {
            if (!(args[i] is dataType))
            {
                args.splice(i,1);
            }
        }
        return (super.push.apply(this, args));
    }

с помощью медика

0 голосов
/ 17 августа 2010

Как насчет расширения метода Array.prototype.push?Украдено у Как расширить Array.prototype.push ()?

Array.prototype.push=(function(){
    var original = Array.prototype.push;
    return function() {
        //Do what you want here.
        return original.apply(this,arguments);
    };
})();

Бросить любой код, который вы хотите, во внутреннее тело функции.

...