2011-05-03 2 views
1

O.K. 여기에 상황이 있습니다 ...중첩 구성 요소에 기능 추가

두 개의 이미지와 4 개의 버튼이 포함 된 사용자 정의 mxml 구성 요소가 있습니다. 구성 요소 파일에는 이미 각 버튼에 대해 clickHandler이 포함되어 있습니다. clickHandler에 액세스하거나 다른 기능을 만들어 내 Main.mxml 파일 내에서 해당 버튼에 연결할 수 있어야합니다. 원래 clickHandlers에 추가해야합니까? 그렇다면이 방법을 내 Main.mxml 파일에 어떻게 적용합니까?

FYI : 구성 요소에는 5 개의 상태가 있고 각 clickHandler에는 상태 간 전환이 트리거됩니다.

protected function submit_clickHandler():void 
     { 
      const state:String = currentState; 
      if (state == 'state1') { 
       currentState='state2'; 
      } 
      if (state == 'state3') { 
       currentState='state4'; 
       addElement(images[i]);  //The methods I want to run from 
       getStudentAnswer();  //within the Main.mxml. 
       submit();     //If I add them here, I get an 
       newQuestion();    //undefined method error. 
      } 
      if (state == 'state4') { 
       currentState='state4'; 
      } 
      if (state == 'state5') { 
       currentState='state4'; 
      } 
      if (state == 'state3') { 
       Sequence1.play(); 
      } 
     } 

     protected function checkAnswer_clickHandler():void 
     { 
      const state:String = currentState; 
      if (state == 'state2') { 
       currentState='state1'; 
      } 
      if (state == 'state4') { 
       currentState='state5'; 
      } 
     } 

감사합니다, JM

+0

그냥 m을 포장하려고합니다. 문제를 해결할 수 있도록 클릭 이벤트를 버블 링하고 Main.mxml에서 리스너를 추가하면 문제가 해결됩니다. 또는 필요한 데이터를 전달하기 위해 맞춤 이벤트를 보낼 수 있습니까? – Corey

+0

코리, 응답 해 주셔서 감사합니다. 내 무지를 용서하십시오. 나는 독학하는 초보자이며 버블 링에 대해 배웠습니다. AS3 참조 가이드를 읽었지만 여전히 완전히 이해하지 못했습니다. 버블 링을 통해 Main.mxml에서 직접 click 이벤트를 참조 할 수 있습니까? 그렇다면 어떻게 설정해야합니까? 내 생각 엔 bubbles = true로 설정 한 다음 Main.mxml에 이벤트 리스너를 넣는 것일까? 샘플 코드가 도움이 될 것입니다. 감사. –

답변

1

당신이 버튼에 대한 디스패치 이벤트에 액세스 할 수있는 경우, 단지 설정 "거품"을 "true"여기

구성 요소 파일에서 두 clickHandlers 있습니다 Main.mxml에서 이벤트를 수신합니다. 표시 목록을 분기가있는 계층 구조 트리로 생각하면 거품이 첫 번째 DisplayObject에 도달 할 때까지 분기 위로 이동하는 이벤트입니다. 그 과정에서 각 DisplayObject를 확인하여 이벤트 캡처를 기다리고 있는지 확인합니다.

여기에는 Main이 클릭 이벤트를 수신하고 자식 Sprite 인스턴스가있는 MovieClip 인스턴스가있는 기본 그림이 있습니다. Sprite 인스턴스에는 click 이벤트를 전달하는 하위 Button 인스턴스가 있습니다.

[object Main] (listening for MouseEvent.CLICK) 
     | 
     |__[object MovieClip] 
       | 
       |___[object Sprite] 
          | 
          |____[object Button] (dispatching MouseEvent.CLICK)

버튼의 파견 클릭 이벤트는 다음과 같습니다 MouseEvent.CLICK는 공통 이벤트가

addEventListener(MouseEvent.CLICK, clickHandler);

입니다

때문에 :

dispatchEvent(new MouseEvent(MouseEvent.CLICK, true));

는 홈페이지에서, 당신은 단지 이벤트를 listend 것 , DisplayObject의 잘못된 이벤트 캡처 가능성을 피하기 위해이 유형의 시나리오에서 사용자 지정 이벤트 (또는 최소한 고유 한 이벤트 이름)를 만드는 것이 좋습니다. 그러나, 이것이 버블 링을 다루는 방법에 대한 더 나은 아이디어를 줄 수 있기를 바랍니다.

- 버블없이

, 도트 구문을 사용하는 것입니다 이벤트를 캡처 할 수있는 유일한 방법입니다. 홈페이지에서

: (다시, 권장하지 않음)

movieClip.sprite.button.addEventListener(MouseEvent.CLICK, clickHandler);
이 지저분 얻을 수 있기 때문에이 방법을 권장하지 않지만,이 버블 링의 개념을 설명하는 데 도움이됩니다 (각 자식 DisplayObject가 공개를 가정)

희망이 도움이됩니다!

[편집 - 추가 된 사용자 정의 이벤트 여기서 사용자 정의 이벤트 클래스은 다음과 같은 형태가 될 것이다

package com.example.events 
{ 
    import flash.events.Event; 

    public class CustomEvent extends Event { 

     public static const WITH_DATA:String = "withData"; 

     public var data:Object; 

     public function NavEvent(type:String, data:Object=null, bubbles:Boolean=false, cancelable:Boolean=false) { 
      super(type, bubbles, cancelable); 
      this.data = data; 
     } 
    } 
} 

당신은 같은 이벤트를 파견 다음과 같습니다

var myString:String = "buttonState"; 
dispatchEvent(new CustomEvent(CustomEvent.WITH_DATA, myString, true)); 

그리고 수신 다음과 같은 일정 :

addEventListener(CustomEvent.WITH_DATA, customEventHandler); 

private function customEventHandler(e:CustomEvent):void { 
    trace(e.data); 
} 
+0

if 문 내에 dispatchEvent를 배치합니까? 구성 요소가 state3 또는 state4 인 경우에만 디스패치하고 싶습니다. 또한 이벤트에 고유 한 이름을 지정하려면 어떻게해야합니까? 나는'dispatchEvent (new MouseEvent ("onSubmitClick", true));'이클립스에서 구문 오류를 나타내지는 않았지만 작동하지 않았다. :) –

+0

if 문에서 전달할 수 있습니다. 그러나 구성 요소가 어떤 "상태"인지를 결정하는 또 다른 방법이 필요합니다.이 위치에서 사용자 지정 이벤트가 도움이됩니다. 위의 맞춤 이벤트 및 사용 예를 추가했습니다. – Corey

+0

다시 Corey에게 감사드립니다. 여러분이 저를 보여주고있는 것에 대해 머리를 감싸는 데는 어느 정도 시간이 걸렸지 만, 제 자바 친구의 도움으로 모든 실린더에서 발사되도록했습니다. 우! –