2011-01-12 3 views
0

이벤트 버블 링에 약간의 이상 함이 있습니다. 이는 어떻게 이것이 정상적으로 작동하는지 이해하지 못한다는 것을 의미합니다.이벤트 버블 링 이상한

DataGroup을 확장하는 구성 요소가 있으며 항목 렌더러가 이벤트를 송출 (거품)합니다.

// MyRenderer.mxml 
<s:ItemRenderer> 
    <s:Button click='dispatchEvent(new Event('customEvent',true))' /> 
</s:ItemRenderer> 

데이터 그룹은 이벤트에 대한 수신기를 자체에 추가합니다.

// MyDataGroup.mxml 
<s:DataGroup itemRenderer="MyRenderer" creationComplete='onCreationComplete()'> 
    <fx:Metadata> 
     [Event(name='customEvent',type='flash.events.Event')] 
    </fx:Metadata> 
    <fx:Script> 
     private function onCreationComplete():void 
     { 
      addEventListener('customEvent',onCustomEvent); 
     } 
     private function onCustomEvent(event:Event):void 
     { 
     } 
    </fx:Script> 
</s:DataGroup> 

데이터 그룹의 상위 항목도 이벤트에 대한 수신기를 추가합니다.

// MyComponent.mxml 
<s:Group> 
    <MyDataGroup customEvent='onCustomEventHandler()' /> 
</s:Group> 

나는 MyDataGroup에 등록 된 핸들러가 MyComponent에, 먼저 핸들러를 이벤트를 잡을 것을 예상 한 것입니다.

그러나 역순으로 보겠습니다. 즉, MyComponent에 걸려, MyDataGroup에 걸렸습니다. 잡히면 event.phase == EventPhase.BUBBLING.

여기 무슨 일 이니? 왜 내가이 행동을보고 있습니까?

저는 Flex 4.0을 사용하고 있습니다.

+1

MyDataGroup에는 이벤트 수신기의 처리기 기능이 없습니다. 복사 및 붙여 넣기 오타 가정합니다, 실제로 해당 오류로 컴파일 할 코드를 기대하지 않았을 것으로 가정합니다. 사용중인 SDK 버전을 지정하십시오. 당신은 내가해야 할 일이 무엇인지 이해하고 있기 때문에, 예기치 않은 행동입니다. 각 구성 요소는 별도의 파일입니까? 아니면 일을 일렬로하고 있습니까? – JeffryHouser

+0

감사합니다. 오류를 수정하도록 업데이트했습니다 (예, 복사 'n'붙여 넣기 문제). 모든 클래스에는 고유 한 mxml 파일이 있습니다. –

답변

2

두 이벤트 모두 MyDataGroup 구성 요소의 동일한 인스턴스를 청취하고 있다는 것이 확실합니다. 대신 MyDataGroup의 MyComponent라고하는 이벤트 리스너를 추가하는 경우

, 당신이 예상거야 행동 :

<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
     xmlns:s="library://ns.adobe.com/flex/spark" 
     xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300" 
      initialize="group1_initializeHandler(event)"> 
    <fx:Script> 
     <![CDATA[ 
      import mx.collections.ArrayCollection; 
      import mx.events.FlexEvent; 
      public function onCustomEventHandler(event:Event):void{ 
       trace('my Component handler'); 
      } 

      protected function group1_initializeHandler(event:FlexEvent):void 
      { 
       // add the event listener to 'this' 
       this.addEventListener('customEvent',onCustomEventHandler); 
      } 

     ]]> 
    </fx:Script> 
    <martyPitt:MyDataGroup id="dataGroup" /> 
    <!-- The event listener here was listening on the myDataGroup instance, not on the MyComponent instance customEvent="onCustomEventHandler(event)" --> 
</s:Group> 

나는 이벤트 리스너를 의심 - 같은 구성 요소에 있지에도 불구하고 - 기반 발사했다 추가 된 순서대로. 컴파일러 인수 '-keep'을 사용하여 생성 된 ActionScript를 조사하여 구체적으로 파악해야합니다. 귀하의 인라인 리스너 (MyComponent)가 MyDataGroup 생성자에 추가 된 것 같습니다. 다른 리스너는 creationComplete 처리기 인 MyDataGroup에 추가되므로 MyComponent 리스너가 먼저 발생합니다.

+0

당신이 바로 이것에 대해서 생각합니다. 나는 문서를 읽고 코드를 가지고 놀면서 같은 결론에 도달했습니다. –

+0

또 다른 옵션은 사용자 지정 구성 요소 내에 이벤트 수신기를 추가 할 때 이벤트 우선 순위를 1로 설정하는 것입니다. Flex는 자동적으로 인 라인 이벤트 리스너 선언에 우선 순위 0을 할당하기 때문에 컴포넌트 핸들러가 먼저 호출된다는 의미입니다. –

0

참으로 이상한 행동. 당신이 이벤트 리스너 인라인을 추가 사실

, (당신의 예제는 :

<MyDataGroup 
customEvent='onCustomEventHandler()' 
/> 

), 프레임 워크는 캡처 단계에서 이벤트 리스너를 추가합니다. 따라서 부모 핸들러에서 먼저 입력되는 예상되는 동작입니다. 내가 알기로는 EventPhase가 EventPhase.BAPBLE_PHASE와 같지만 EventPhase.CAPTURE_PHASE가 표시되어야합니다.

+0

-1 Marty의 코드를 가져 와서 Flex 4.0 SDK를 사용하여 결과를 복제 할 수있었습니다. EventPhase는 확실히 '3'을 표시하고 있으며 이는 문서에 따라 버블 링 단계입니다. (http://livedocs.adobe.com/flex/3/html/help.html?content=events_08.html); 이벤트 리스너가 예기치 않은 순서로 실행됩니다. 기괴한 – JeffryHouser

+0

나는 그것이 내가 실제로 말하려고했던 것이다. 내 코드에서는 부모 처리기에서 먼저 처리 한 다음 구성 요소에서 처리합니다. 그러나 이것은 내가 말했듯이 customEvent = "onCustomEventHandler()"를 수행 할 때 캡처 단계에 대한 이벤트를 추가하기 때문에 기대할 수있는 것입니다. (나는 문서에서 읽었던 것을 기억한다.) 그래서 나는 결과를 다음과 같이 해석한다 : 그것은 캡쳐 단계 동안 부모에서 먼저 들어가고, 거품 단계에서 컴포넌트로 나타난다. 이상한 점은 BUBBLE_PHASE가 표시된다는 것입니다. 우리는 적어도 거기에 뭔가 잘못되고 있다는 것에 동의 할 수 있습니다.) –

+0

그래, 의사를주의 깊게 읽은 후에, 나는 틀렸어. R : "이벤트 리스너 인라인을 추출하면 addEventListener() 메서드를 사용하여 등록하는 것보다 유연성이 떨어집니다 단점은 Event 객체에서 useCapture 또는 priority 속성을 설정할 수 없으며 추가 한 리스너를 제거 할 수 없다는 것입니다. " 그래서 나는 그것이 버블 링 단계를위한 이벤트 리스너를 추가하고 아마 높은 수의 우선 순위를 설정했다는 것을 의미하는 것 같아요. –

관련 문제