2011-05-03 74 views
1

O.K.這裏的情況...爲嵌套組件添加功能

我有一個自定義的mxml組件,其中包含幾個圖像和4個按鈕。組件文件已經包含每個按鈕的clickHandler。我需要能夠訪問clickHandler或創建另一個功能並將其附加到我的Main.mxml文件中的這些按鈕。我應該添加到原來的clickHandlers?如果是這樣,我該如何將該方法應用到我的Main.mxml文件中?

供參考:組件有5個狀態,每個clickHandler觸發狀態之間的轉換。

下面是組件文件兩個clickHandlers

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 2011-05-03 17:30:29

+0

科裏,謝謝你的迴應。原諒我的無知。我是一個自學成才的新手,並沒有學會冒泡。我閱讀AS3參考指南,但仍然不完全明白。 Bubbling是否允許我直接從我的Main.mxml中引用click事件?如果是這樣,我該如何設置它?我的猜測是設置bubbles = true,然後在Main.mxml中放置一個事件監聽器?示例代碼會很有幫助。謝謝。 – 2011-05-03 23:11:26

回答

1

如果你有機會到調度事件的按鈕,只需將「泡沫」到「真」並在Main.mxml中監聽事件。如果您將顯示列表視爲具有分支的分層樹,則會出現一個事件,即氣泡將沿分支前進,直到它到達第一個DisplayObject。一路上,它檢查每個DisplayObject以查找它是否在等待捕獲事件。

這裏是一個基本的例子,其中Main正在監聽點擊事件,並且有一個帶有子Sprite實例的子MovieClip實例。 Sprite實例具有調度單擊事件的子Button實例。

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

按鈕,在派出點擊事件:

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

在主,你只需listend的事件:

addEventListener(MouseEvent.CLICK, clickHandler);

由於MouseEvent.CLICK是這樣一個共同的事件,我會建議在這種情況下創建一個自定義事件(或至少一個唯一的事件名稱),以避免DisplayObject捕獲不正確事件的可能性。但是,希望這可以更好地瞭解如何處理冒泡。

-

沒有冒泡,只有其他的方式來捕獲事件是使用點語法。我不推薦這種方法,因爲它可能會導致混亂,但是這有助於說明冒泡的概念(假設每個子DisplayObject是公開的):

在主營:(再次,不推薦)

movieClip.sprite.button.addEventListener(MouseEvent.CLICK, clickHandler);

希望有幫助!

[編輯 - 添加自定義事件] 這裏是一個自定義事件類會是什麼樣子:

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));'Eclipse沒有顯示任何語法錯誤,但它也不起作用。 :) – 2011-05-05 23:05:19

+0

您可以從if語句派發。但是,您需要另一種方法來確定組件處於哪個「狀態」。這是自定義事件的幫助。我已經在上面添加了自定義事件和用法的示例。 – Corey 2011-05-06 15:02:03

+0

再次感謝科裏。我花了一段時間才把自己的頭圍繞在你展示給我的東西上,但在我的Java朋友的一點幫助下,我們得到了它在所有氣瓶上的射擊。哇噢! – 2011-05-13 09:46:41