當組件分派事件時,事件流將分爲三個階段:捕獲 - 事件從應用程序流向分派事件的組件,當事件發生在實際調度事件的目標時,然後是事件從目標流向應用程序的冒泡階段。有一種情況是應用程序具有子comp1,comp1具有子comp2。我在comp1中有一個按鈕,用於分派事件,並且我想在comp2中監聽該事件。理想情況下,事件將從Application-> comp1-> button-> comp1-> Application中流動。我怎樣才能實現我的目標?如何監聽由父組件分派的子組件內部的事件
回答
裏面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
與內置事件不一致。
你提出的建議可能不是最好的解決方法。你應該更好地處理這個問題,讓父母明確地做一些事情,幫助孩子知道該怎麼做。
這樣做的一種方法是使用事件總線的概念,如what you see in RobotLegs。只要給你的孩子2一個名爲eventBus
的公共領域或財產,並帶有一個IEventDispatcher類型。然後,您可以讓父項用this
填充此屬性。我通常將這些屬性設置爲獲取者/設置者,以便當孩子從舞臺上移開並且孩子可以remove its listeners時,該屬性可以被消除。
這可以讓你準確地開始做到這一點,但是如果你發現自己在使用child2的時候需要它來傾聽不同的對象,那麼你就準備好了。
第二種可能性是在父項可以調用的子項上公開一個方法(父項已經有一個對子項的引用 - 這裏不會引入不必要的耦合),只需調用它而不是調度事件。
就第一種方法達成一致。我通常也做類似的事情,但我想我會給出一個更簡單的答案開始。海事組織第二種方法確實在觀點的層級結構中建立了耦合。如果我想將'comp2'移動到另一個位置(比如說我想重構它以便它嵌套在另一個自定義組件中),那就會破壞代碼。 – RIAstar
確實如此,但是您可能已經有了一個可以引用它的變量,這個變量不得不被剝離出來。因此,無論採用哪種方式移動該組件都有額外的工作。重要的是組件本身不需要改變。但我同意,公交巴士是要走的路,而且你的建議甚至可以通過這種方式來實施,以便開始並在稍後改變。 –
- 1. 如何監聽父組件中呈現的所有子組件?
- 2. ExtJS 4不能監聽組件內部的事件
- 3. Angular2:子組件如何始終監聽來自父組件的輸入onInit
- 4. 創建一個由組件監聽的控制器事件
- 5. 如何從子組件中調用父組件中的事件?
- 6. 組合框的事件監聽
- 7. Parent JPanel - 如何監聽由一個Child JPanel組件生成的事件?
- 8. 如何從父組件設置Ember組件的內部狀態?
- 9. 角4父組件事件偵聽器不會被孩子發出的事件
- 10. 在組件的子組件上添加MXML事件偵聽器
- 11. 獲取事件監聽器數組
- 12. 部分內部的組件
- 13. 將事件偵聽器添加到多個子組件或簡單父組件
- 14. 由ajax加載的事件監聽器
- 15. 父組件中的父元件中的觸發事件從路由中的子組件加載Angular
- 16. 添加事件偵聽器,以形成由事件監聽器
- 17. 外部JS文件 - 事件監聽器
- 18. 如何在appcelerator中監聽圖像組中的單擊事件
- 19. 聚合物1:父組件未從子組件的「分離」方法中偵聽火災事件?
- 20. Angular2路由,父子路由組件vs查看組件
- 21. 從動態創建的組件監聽事件
- 22. 在Vue.js中監聽div組件的「esc」鍵事件
- 23. VueJS:多個組件監聽相同的事件
- 24. Actionscript組件可以監聽它自己的propertyChange事件嗎?
- 25. 多個事件的事件監聽器
- 26. Angular2子組件控制父組件的路由
- 27. 監聽$範圍內的多個事件
- 28. jQuery事件監聽
- 29. 事件監聽器?
- 30. Laravel事件監聽
如果有其他事件發送相同的事件,comp1也會聽到。 –