2011-04-14 4 views
1

나는이 post을 기반으로하는 코드를 사용하고 있습니다.선택한 구성 요소 이상에 Focus_out 이벤트를 적용하는 방법

커밋해야 할 변경 사항이 있는지 감지하기 위해 focus_out 이벤트를 사용합니다. 그러나 FOCUS_OUT 이벤트는 텍스트 필드를 클릭하고 컴포넌트 내부를 클릭하는 경우에만 호출됩니다. 구성 요소 외부에서 클릭 수를들을 수있는 방법이 있습니까? LabelEditor 클래스에서

addEventListener(FocusEvent.FOCUS_OUT, onFocusOut); 

    protected function onFocusOut(event:FocusEvent):void 
    { 
     _updatedText = text; 

     if(_updatedText != _originalText){ 
      dispatchEvent(new Event(Event.CHANGE)); 
     } 

     setEditable(false); 
    } 

답변

2

를 수신 할 수 초점 밖으로에 Event.CHANGE 이벤트를 전달합니다, 당신은이 작업을 수행 할 수 있습니다

systemManager.addEventListener(FocusEvent.KEY_FOCUS_CHANGE, focusChangeHandler); 
systemManager.addEventListener(FocusEvent.MOUSE_FOCUS_CHANGE, focusChangeHandler); 

그냥 구성 요소가 스테이지에서 제거되기 전에 이벤트 리스너를 정리하고 제거해야합니다 (동적으로 추가되었다고 가정). 그렇게하면 일련의 이벤트 리스너가 겹쳐지지 않게됩니다. , 다시

systemManager.addEventListener(MouseEvent.MOUSE_DOWN, system_mouseDownHandler); 

private function system_mouseDownHandler(event:MouseEvent):void { 
    if(!event.target != this && !this.contains(event.target as DisplayObject)){ 
    // Do Something Here 
    } 
} 

이 구성 요소가 추가되는 경우 반드시 정리 모든 이벤트 리스너합니다

또는, 당신은 단지 누군가가 특정 구성 요소의 외부 클릭 할 때마다 찾을하려는 경우, 당신은 이런 식으로 뭔가를 할 수/동적으로 제거되었습니다.

희망이 도움이됩니다.

편집 :

당신은 정리에 이벤트 리스너를 원하는이 같은 (제거 이벤트가 구성 요소에서 트리거 될 때 호출) 할 경우

<mx:Component remove="myRemoveHandler();" /> 

private function myRemoveHandler():void { 
    if(systemManager.hasEventListener(MouseEvent.MOUSE_DOWN) systemManager.removeEventListener(MouseEvent.MOUSE_DOWN, system_mouseDownHandler); 
} 

은 분명히 당신이 끝난 이벤트 리스너를 대체를 (초점 또는 마우스)를 사용하여

+0

onfocusout 이벤트가있는 itemrenderer를 포함하는 목록의 init 함수에 추가했습니다. 지금 목록의 init 함수가 상태가 처음 방문되었을 때만 실행된다면 (나는 그것이 작동하는 방법이라고 생각한다.) 리스너를 쌓는 것에 대해 걱정할 필요가 있는가? – Damon

+0

removeChild() 및 addChild()를 사용하는 경우에 대비하여 이벤트 리스너를 정리하는 방법을 보여주기 위해 내 대답을 업데이트했습니다. 녹색 확인을 클릭하여 허용 된 것으로 응답을 표시하십시오. – andrewpthorp

+0

내가 무슨 뜻인지는 이벤트 리스너가 응용 프로그램 런타임 중에 한 번만 초기화되는 구성 요소에 있으므로 리스너가 두 번 이상 나타나서는 안됩니다. (bc. addChild/removeChild를 사용하고 있지 않습니다.) hasEventListener 명령이 표시됩니다. 매우 유용한, 감사합니다. – Damon

1

방금 ​​구성 요소 자체에서 해당 이벤트

+0

dipatcher에서 버블 링을 사용하여 재생해야 할 수도 있습니다. –

+0

focus_out에서 함수를 호출하지만 함수가 호출되지 않아 구성 요소 외부를 클릭해도 focus_out으로 계산되지 않으므로 아무 것도 보내지 않습니다. 당신은 내가 주 응용 프로그램에 이벤트 리스너를 가지고 있다고 생각하는데 초점을 맞추기 위해 레이블러를 포함하고있는 목록을 듣고있다. – Damon

+0

초점을 바꿀 때 초점을 변경해야합니다. 패널이나 캔버스를 클릭해도 포커스를 변경할 수 없으므로 포커스는 변경되지 않습니다. 당신은 당신의 접근 방식을 다시 생각하고 싶을지도 모른다. –

관련 문제