2010-07-16 5 views
1

2 개의 파일이 있는데 하나는 이벤트를 보내고 1 개는 이벤트 클래스 자체에 추가됩니다..AS 클래스에서 시작된 이벤트 수신 안 함

디스패치 및 수신 파일이 모두 mxml이지만 이번에는 the dispatching file is an actionscript class 일 때이 작업을 수행했으며 이번에는 작동하지 않습니다. actionscript 클래스와 다른가요?

여기에 파견 클래스는 즉시이 생성됩니다으로 이벤트를 전달 다운 무식 버전

입니다. 내 기본 MXML 응용 프로그램에서

public class ASClass extends UIComponent{ 

    public function ASClass(){ 
     dispatchEvent(new MyEvents(MyEvents.FIRE_EVENT)); 
    } 
} 

, 나는 즉시 자동으로이 만들어지는 메인 MXML 응용 프로그램을 다시 받아야로 이벤트를 전달 ASClass를 인스턴스화합니다. 하지만 뭔가 작동하지 않습니다. 메인 MXML 응용 프로그램 -

protected function appCComplete(event:FlexEvent):void{ 
    addEventListener(MyEvents.FIRE_EVENT, gotEvent); 
    var asClass:ASClass = new ASClass(); 

} 

protected function gotEvent(event:MyEvents):void{ 
     Alert.show("got event");   
} 

답변

2
addEventListener(MyEvents.FIRE_EVENT, gotEvent); 

this 객체에 의해 전달 FIRE_EVENT을 수신

this.addEventListener(MyEvents.FIRE_EVENT, gotEvent); 

으로 동일합니다. asClass 객체에서 발생한 이벤트를 수신하려면 해당 객체에서 addEventListener를 호출해야합니다.

asClass.addEventListener(MyEvents.FIRE_EVENT, gotEvent); 

따라서 생성자에서 시작한 이벤트를 수신 할 수 없습니다. 다음 코드는 asClass 개체 (생성자 이외의 다른 곳)에서 발생한 이벤트를 수신하는 올바른 방법을 보여줍니다.

protected function appCComplete(event:FlexEvent):void{ 
    var asClass:ASClass = new ASClass(); 
    asClass.addEventListener(MyEvents.FIRE_EVENT, gotEvent); 
} 

protected function gotEvent(event:MyEvents):void{ 
     Alert.show("got event");   
} 

생각해 보면 이해할 수 있습니다. 생성자는 객체를 만드는 데 사용됩니다. 이벤트 구독자는 일반적으로 객체가 완전히 작성되고 기능을 수행하면 객체에 발생하는 일부 동작/변경 사항에 관심이 있습니다.

즉, this에 대한 참조 또는 해당 함수를 ASClass의 생성자에 전달한 다음 원하는 경우 해당 함수를 생성자 내에서 이벤트 수신기로 할당 할 수 있습니다. 생성자를 반환 후 이벤트를 수신하도록 약간의 재 설계를 고려하십시오

public class ASClass extends UIComponent{ 
     public function ASClass(listener:Function){ 
      this.addEventListener(MyEvents.FIRE_EVENT, listener); 
      dispatchEvent(new MyEvents(MyEvents.FIRE_EVENT)); 
     } 
    } 

    var asClass:ASClass = new ASClass(this.gotEvent);//pass the function. 

//or 

    public class ASClass extends UIComponent{ 
     public function ASClass(listenerObj:Object){ 
      this.addEventListener(MyEvents.FIRE_EVENT, listenerObj.gotEvent); 
      dispatchEvent(new MyEvents(MyEvents.FIRE_EVENT)); 
     } 
    } 

    var asClass:ASClass = new ASClass(this);//pass the object. 

개인적으로, 나는이 길을 가고 싶어 많은 시나리오를 생각할 수 없다.

+1

@cooper 경쟁 조건이 없습니다. 요점은 이벤트를 전달하는 객체로 이벤트 리스너를 호출해야한다는 것입니다. 그러므로 당신은'asClass.addEventListener'를 호출해야합니다 - asClass'가 null 일 때 생성자를 호출하기 전에는 이것을 할 수 없습니다. 이벤트 리스너는 이벤트가 전달되기 전에 추가되어야하지만 디스패치 객체가 만들어진 후에 만 ​​수행 할 수 있습니다. – Amarghosh

+1

_it은 이벤트를 전달하는 ASClass보다 느리지 않습니다 ._ 내가 여기에서 당신을 이해하는지 모르겠습니다. – Amarghosh