2011-03-29 51 views
3

我剛剛從昨天開始使用GWT,所以也許我沒有使用合適的機制來解決這個問題。所以,我會盡力解釋我想要做什麼(有一個簡單的問題)以及我提出的兩個解決方案來解決這個問題。如何在GWT中全局修改/訪問小部件?

問題

記住,可以通過其他部件被更新的索引。我們用焦點來表示它。

[button 1] 
[button 2]  [button A] 
[button 3] 
  • 按鈕[1..3]和[A]不在相同的類和需要找到使用使用DOM的ID的元素。原因是這兩個視圖需要正交。
  • 我們可以使用上/下鍵,從鍵1的焦點移動到3
  • 如果我們上的按鈕[1..3],然後按正確的,我們去的按鈕A.
  • 如果我們在按鈕A上並向左按下,我們轉到先前已聚焦的按鈕。

我們想要做的是按右鍵時保存或設置焦點索引。

解決方案1 ​​:全局變量

我不喜歡平時全局變量,但在某些情況下,它很方便。通過使用例如在JavaScript中全局定義的字典(Dictionary.getDictionary),我可以使用「聚焦事件」在該情況下將當前索引保存在其中。

所以,在按鍵事件中,當左鍵被觸發時,我只會讀取字典中的值。

我還沒有測試過,但我認爲它應該工作。

解決方案2:與元素

Element element = DOM.getElementById("button id A"); 
element.<setFocusLeftKey>("button id [1..3]"); 

此處設置的值是什麼,我想實現的就是剛剛在「聚焦狀態」事件,我想簡單地設置按鈕的值。

  • 那麼有可能使用Element來施放/找到對象?我認爲如果沒有簡單的方法,可能是因爲不推薦。
  • 有沒有更簡單的方法/其他方法來實現呢?

因此,任何思想或解決方案?

在此先感謝。

P.S.我還沒有找到一個更好的標題,所以如果有任何建議,只是把它放在評論中,我會更新它。

回答

1

在GWT中使用ID絕對不是建議的方式。你說你需要這種機制來保持你的觀點彼此正交。這是高貴的,但在GWT中,您可以通過使用另一個資源(一個EventBus,在SimpleEventBus中實現)來實現,這些資源隱藏了彼此不同的組件。實際上,我認爲通過ID查找元素強烈地支持這兩種觀點並且是臭的。

武裝你的EventBus,你只需創建並激發允許視圖(或更好的是,他們的演示者)相互通信的自定義事件。例如,在這裏您可以有:NavigateRightFromButtonsEventNavigagteLeftFromButtonA事件。

但是,根據您的應用程序的大小(或作爲第一個實驗),您可以決定結合兩個視圖。在這種情況下,只需將按鈕列表的視圖轉換爲按鈕A的視圖,反之亦然。這並不比依靠全球ID更糟糕。

無論您選擇哪種機制(事件總線或將視圖連接在一起),您現在應該可以直接訪問要突出顯示的小部件實例。要專注,請撥打setFocus(true)就可以了。

+0

感謝您的建議,我將開始尋找活動巴士來了解我如何整合它,以及它是否可以作爲解決方案。對於「ID耦合」,我不認爲它實際上是一個糟糕的設計。我唯一遇到的問題是它不是編譯時間。 – Sauleil 2011-03-30 12:54:17