Flex4 sdk를 예전에 처음 봤을 때, 
"이거 나중에 문제 생기겠는데..." 생각했던 코드를 봤었는데 결국 오늘 문제가 생겼습니다.

먼저 예제를 보겠습니다.

소스보기(두개의 결과물을 같은 소스로 컴파일)


Flex3 예제



Flex4 예제



예제설명
버튼 컴포넌트에서 마우스롤오버 같은 시각적인 변화가 일어나면 랜더링후 update_complete 이벤트가 송출 됩니다. 이때 캔버스에서 update_complete 이벤트를 캡쳐링 단계에서 리스닝하여 이벤트 정보를 Alert으로 띄우는 예제 입니다.


문제점
위 두개의 예제의 버튼에 마우스를 올려보면 Flex3에서정상적으로 캔버스에서 캡춰가 되지만 Flex4에서는 캡춰가 되지 않습니다. Flex4 sdk의 UIComponent 와 LayoutManager 소스를 보면 다음과 같이 되어 있습니다.

UIComponent 소스의 일부
if (hasEventListener(FlexEvent.ENTER_STATE))
   dispatchEvent(new FlexEvent(FlexEvent.ENTER_STATE)); 

LayoutManager 소스의 일부
if (obj.hasEventListener(FlexEvent.UPDATE_COMPLETE))
   obj.dispatchEvent(new FlexEvent(FlexEvent.UPDATE_COMPLETE));

Flex3 에서는 dispatchEvnet() 전에 hasEventListner()로 리스너가 있는지 검사하지 않지만, 
Flex4 에서는 해당 리스너가 있을 경우만 이벤트를 송출하기 때문에 문제가 발생한 것이었습니다.
(각 컨트롤의 자체적인 이벤트는 제외)
따라서, Flex4 예제에서 캔버스가 캡춰단계에서 리스닝하기 위해서는 버튼이 이벤트를 송출할 수 있도록 버튼자체에 update_complete 리스너가 등록되어 있어야 합니다.


그렇다면...
부모 컨테이너에서 자식의 화면이 갱신되는걸 알려면 어떻게 해야 할까요...
Flex3에서는 update_complete로 캡춰를 통해 알 수 있었지만, Flex4에서는 불가능합니다.
HSlider를 예를들면, 크게 track과 thumb으로 구성되어 있는데 각각의 track과 thumb자체에 update_complete 리스너가 장착되어 있지 않기 때문에, 송출 자체가 되지 않습니다.
자식에 리스너가 없고 부모에서 자식의 이벤트를 캡춰하는 경우가 빈번한건 아니지만 분명 그런 상황이 있습니다.
이 문제를 어떻게 해결해야 할까요?
신고
Posted by 째코


티스토리 툴바