0

따라서 이벤트가 표시 목록에 나타납니다. 그것이 당신이 원하는 것이라면 그것은 대단합니다. 그러나 무대에서 서로 관련없는 이벤트를 서로 다른 이벤트를 청취 할 필요가 있다면 어떻게해야할까요? 단순화 된 예 :AS3 디스플레이 목록과 관련이없는 객체에 이벤트를 전달합니다.

var objA = new ObjA; 
addChild(objA); 

var objB = new ObjB; 
addChild(objB); 

var objC = new ObjC; 
objB.addChild(objC); 

개체 B는 객체 C.에 의해 전달 된 이벤트를 수신 할 수 있습니다 그러나 나는 또한 또한, 이러한 개체가 다른 클래스에서 만든 '나는 할 수 있도록 객체 C.에 의해 전달 된 이벤트를 수신하는 객체가 필요 서로 하드 코드 참조. 해결책?

답변

0

솔루션 : 당신의 이벤트가 제대로 버블 링하는 경우 DisplayObject으로 확장되고 디스플레이 체인에있는 클래스에서 스테이지의 수신기를 설정할 수 있어야합니다.

catch : 표준 이벤트를 수신하는 경우 특정 이벤트가 하나의 "장소"에서만 제공 될 수 있다는 것을 알지 못하면 실제로 어디에서 오는지 알 수 없습니다.

수정 : 이와 같은 경우 맞춤 이벤트를 보내시는 것이 가장 좋습니다. DisplayObject

stage.addEventListener(MyAwesomeEvent.SOMETHING_SUPER_SWEET, sweetHandler) 
+0

감사합니다. – phil

0

그러면 아마도 싱글 톤 EventDispatcher을 만들고 그것을 모든 클래스에서 사용하여 이벤트를 전달할 수 있습니다.

package <WHATEVER> 
{ 
    import flash.events.*; 
    public class SingletonDispatcher extends EventDispatcher { 
    private static var dispatcher:SingletonDispatcher = null; 
    public function SingletonDispatcher (enforcer:SingletonEnforcer) : void { 
     if (!enforcer) { 
     throw new Error("Direct instatiation is not allowed"); 
     } 
     return; 
    }// end function 
    public static function GetInstance() : SingletonDispatcher { 
     if (!dispatcher) { 
     dispatcher= new SingletonDispatcher (new SingletonEnforcer()); 
     }// end if 
     return dispatcher; 
    }// end function 
    } 
} 
class SingletonEnforcer {} 

그런 다음 당신이 좋아하는 모든 클래스에서 사용할 수 있습니다

public class C { 
... 
SingletonDispatcher.GetInstance().dispatchEvent(new SomeEvent()); // instead of this.dispatchEvent 
... 
} 

그리고 클래스 A에,들을 수 있습니다 :

public class A { 
    ... 
    SingletonDispatcher.GetInstance().addEventListener(SomeEvent.UNREACHABLE_EVENT, thankGod); 
    ... 
} 
+0

흥미로운 솔루션. 내 물건이 무대에 접근 할 수 없다면 이것을 탐구 할 것입니다. – phil

0

청취자를 제거 할 필요는 사실 로 설정해야합니다하여 addEventListener()의 마지막 매개 변수를 사용하는 경우는 의미가 없다 확장하는 모든 클래스의 내부


청취자가 약한 참조를 사용하므로 GC가 청취자의 소유자를 수집하지 못하게합니다.

관련 문제