2011-03-09 2 views

답변

3

청중을주의 깊게 추적해온 경우에만. 이벤트 리스너에는 "removeAll"유형 기능이 없으므로 관리하기 쉬운 장소에 리스너를 수집하는 데 도움이됩니다.

+0

. 사실, 이벤트 리스너에 대해 "모두 제거"기능이있을뿐만 아니라 "ENTER_FRAME에 응답합니까?"이상의 모든 검사를 수행 할 수있는 방법이 없으므로 철저한 반복적 검사를 수행하고 제거 할 수도 없습니다 당신이 사건의 표적을 읽을 방법이 없기 때문에 당신이 발견 한 것들. 가장 좋은 방법은 추가 방법에주의하는 것입니다. –

2

개체는 IEventDispatcher 개체에 이벤트 수신기를 추가하고 해당 개체를 등록하고 동시에 모든 이벤트 수신기를 제거하는 클래스를 만드는 옵션입니다.

:이 예제를 실행의 출력은 다음과 같다

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 

    public class Main extends Sprite 
    { 
     private var _eventListeners:EventListeners; 
     private var _sprite1:Sprite; 
     private var _sprite2:Sprite; 

     public function Main() 
     { 
      init(); 

     }// end function 

     public function init():void 
     { 
      _eventListeners = new EventListeners(); 
      _sprite1 = new Sprite(); 
      _sprite2 = new Sprite(); 

      _eventListeners.addEventListener(_sprite1, Event.ENTER_FRAME, enterFrameHandler); 
      _eventListeners.addEventListener(_sprite2, Event.ADDED_TO_STAGE, addedToStageHandler); 

      trace("_sprite1.hasEventListener = " + _sprite1.hasEventListener(Event.ENTER_FRAME)); 
      trace("_sprite2.hasEventListener = " + _sprite2.hasEventListener(Event.ADDED_TO_STAGE)); 

      _eventListeners.removeAll(); 

      trace("\n_eventListeners.removeAll() invoked\n"); 

      trace("_sprite1.hasEventListener = " + _sprite1.hasEventListener(Event.ENTER_FRAME)); 
      trace("_sprite2.hasEventListener = " + _sprite2.hasEventListener(Event.ADDED_TO_STAGE)); 

     }// end function 

     private function enterFrameHandler(e:Event):void {}; 
     private function addedToStageHandler(e:Event):void {}; 

    }// end class 

}// end package 

:

EventListeners.as :

package 
{ 
    import flash.events.Event; 
    import flash.events.IEventDispatcher; 
    import flash.utils.Dictionary; 

    public class EventListeners 
    { 
     private var _objectDictionaries:Vector.<Dictionary>; 

     public function EventListeners() 
     { 
      init(); 

     }// end function 

     public function addEventListener(object:IEventDispatcher, 
             type:String, 
             listener:Function, 
             useCapture:Boolean = false, 
             priority:int = 0, 
             useWeakReference:Boolean = false) 
     { 
      object.addEventListener(type, listener, useCapture, priority, useWeakReference); 

      var objectDictionary:Dictionary = new Dictionary(); 
      objectDictionary["object"] = object; 
      objectDictionary["type"] = type; 
      objectDictionary["listener"] = listener; 
      objectDictionary["useCapture"] = useCapture; 
      _objectDictionaries.push(objectDictionary); 

     }// end function 

     public function removeAll():void 
     { 
      for each(var objectDictionary:Dictionary in _objectDictionaries) 
      { 
       var object:IEventDispatcher = objectDictionary["object"] as IEventDispatcher; 
       var type:String = objectDictionary["type"] as String; 
       var listener:Function = objectDictionary["listener"] as Function; 
       var useCapture:Boolean = objectDictionary["useCapture"] as Boolean; 

       object.removeEventListener(type, listener, useCapture); 

      }// end for 

      init(); 

     }// end function 

     private function init():void 
     { 
      _objectDictionaries = new Vector.<Dictionary>(); 

     }// end function 

    }// end class 

}// end package 

Main.as 다음은 내가 빨리이를 입증하기 위해 만든 예이다

_sprite1.hasEventListener = true 
_sprite2.hasEventListener = true 

_eventListeners.removeAll() invoked 

_sprite1.hasEventListener = false 
_sprite2.hasEventListener = false 
+0

+1 ... 유일한 단점은 자연스러운 형식과 다른 addEventListener 구문입니다 (이 경우 EventDispatcher 객체를 먼저 전달해야 함). – NemoStein

+1

@NemoStein은이 'addEventListener()'를 'registerEventDispatcher()'라고 생각합니다. 대신에'IEventDispatcher' 객체를 파싱하는 것이 단점이 아니라 오히려 메소드의 요점임을 깨닫게 될 것입니다. 하지만 언뜻보기에 왜이 'addEventListener()'메소드가 동의어 인 'IEventDispatcher.addEventListener'의 변형 된 버전처럼 보이는지 이해할 수 있습니다. 메서드가 유사하지만 완전히 똑같지 않기 때문에 같은 이름을 부여했습니다. – Taurayi

관련 문제