2012-10-16 28 views
0

當組件分派事件時,事件流將分爲三個階段:捕獲 - 事件從應用程序流向分派事件的組件,當事件發生在實際調度事件的目標時,然後是事件從目標流向應用程序的冒泡階段。有一種情況是應用程序具有子comp1,comp1具有子comp2。我在comp1中有一個按鈕,用於分派事件,並且我想在comp2中監聽該事件。理想情況下,事件將從Application-> comp1-> button-> comp1-> Application中流動。我怎樣才能實現我的目標?如何監聽由父組件分派的子組件內部的事件

回答

1

裏面comp1派遣您的活動,並確保它泡:

myButton.addEventListener(MouseEvent.CLICK, handleMyButtonClick); 

private function handleMyButtonClick(event:MouseEvent):void { 
    dispatchEvent(new Event("myCustomEvent", true)); 
} 

現在裏面comp2用於偵聽stage此事件:

stage.addEventListener("myCustomEvent", handleMyCustomEvent); 

就是這樣:因爲事件泡沫,它會總是在某個點擊中stage。所以你可以用它來從任何地方收聽。在嘗試附加偵聽器之前,請不要忘記確保stage屬性comp2已設置。

注意:請注意,應用程序中的所有組件都能夠參見此事件,因此請確保正確的組件處理正確的事件。對於初學者,我決不會在內置事件中使用這種方法;僅使用自定義事件,其type與內置事件不一致。

+0

如果有其他事件發送相同的事件,comp1也會聽到。 –

0

你提出的建議可能不是最好的解決方法。你應該更好地處理這個問題,讓父母明確地做一些事情,幫助孩子知道該怎麼做。

這樣做的一種方法是使用事件總線的概念,如what you see in RobotLegs。只要給你的孩子2一個名爲eventBus的公共領域或財產,並帶有一個IEventDispatcher類型。然後,您可以讓父項用this填充此屬性。我通常將這些屬性設置爲獲取者/設置者,以便當孩子從舞臺上移開並且孩子可以remove its listeners時,該屬性可以被消除。

這可以讓你準確地開始做到這一點,但是如果你發現自己在使用child2的時候需要它來傾聽不同的對象,那麼你就準備好了。

第二種可能性是在父項可以調用的子項上公開一個方法(父項已經有一個對子項的引用 - 這裏不會引入不必要的耦合),只需調用它而不是調度事件。

+0

就第一種方法達成一致。我通常也做類似的事情,但我想我會給出一個更簡單的答案開始。海事組織第二種方法確實在觀點的層級結構中建立了耦合。如果我想將'comp2'移動到另一個位置(比如說我想重構它以便它嵌套在另一個自定義組件中),那就會破壞代碼。 – RIAstar

+0

確實如此,但是您可能已經有了一個可以引用它的變量,這個變量不得不被剝離出來。因此,無論採用哪種方式移動該組件都有額外的工作。重要的是組件本身不需要改變。但我同意,公交巴士是要走的路,而且你的建議甚至可以通過這種方式來實施,以便開始並在稍後改變。 –

相關問題