0

我的工作在谷歌關閉一個Web應用程序,其中的結構是這樣的:關閉事件冒泡

App 
    + Control Pane 
    | + Search Box 
    | + Search Button 
    + Result Pane 
    + Results 
    + Next Page Link 

實際的元件結構是一個相當複雜一點。重要的一點是,組件樹中有許多不同的組件可以啓動某些操作。在這個例子中,輸入Search Box,按Search Button,或擊中Next Page都需要查詢。

這很容易處理。所有子組件樹中任何地方都可以做

this.dispatchEvent(App.EventType.ACTION, ...) 

App就能當事件向上傳播到收聽。問題是另一個方向:當App從其查詢中接收數據時,它必須將其推送給所有的孩子。

App似乎非常脆弱,試圖直接推送到Search boxResults,因爲它們在組件樹中的位置可能會更改。我想要做的是發起一個App.EventType.DATA_RECEIVED事件,並讓所有的孩子(和子孩子等)聽到它。

爲此在谷歌關閉,我已經能夠找到的唯一方法是使全球公共單一實例的App和源用於所有App.EventType.DATA_RECEIVED事件,或者通過向所有兒童下探App和subchildren。

這兩個都是他們自己的方式混亂和脆弱。

在閉包中有一種簡單的方法來調度向下冒泡的事件嗎?

+0

這聽起來更像是一個設計決定給我。我假設你想讓應用的其餘部分可用的數據是模型的一部分,那麼爲什麼你不要將單個組件綁定到聽他們感興趣的模型的位,並解析數據得到它並有模型調度更改事件。 ala綁定。 – lennel

回答

0

這不是一個非常滿意的答覆,但它是我看中了:

有溝通這樣的事情組件樹沒有什麼好辦法。即使封閉本身碰到這個問題,將樹下的opt_domHelper傳遞給每個子組件。

我的建議是繼承goog.ui.Component爲您的應用程序並創建一個myapp.Environment類,它包含兩個opt_domHelper和其他環境變量,指定爲應用程序的事件通道,如一個事件監聽器。

這不是解決方案本身,但它是所有可能的罪惡中最少的。如果你已經在任何地方都盡職盡責地傳遞opt_domHelper,那麼問題不會變得更糟:管道變得更具可擴展性,並且opt_domHelper本身對實現者隱藏起來(現在通過environment來代替)。