2011-06-07 68 views
7

如何從一個地方到另一個地方獲得一個對象?GWT活動和地點通過參考

例如,我有一個ContactsView和一個Contacts表以及相應的ContactsActivity/Place類。如果我想編輯聯繫人,我點擊表格行並轉到ContactEditorPlace。 ContactEditorView如何獲取聯繫人進行編輯?

我所看到的例子似乎沒有在場所中傳遞實際的對象引用,但是他們卻遇到了傳遞String或id(例如Expenses樣本)的麻煩。除了簡單的標記化之外,是否有任何其他原因?是否有某些原因引用不應在某個地方?

如果未在ContactEditorPlace的構造函數中設置對象引用,那麼它如何獲取ContactEditorActivity?這可以通過EventBus來完成,但是將單個引用傳遞給單個活動將成爲很多樣板。

我會說我沒有使用RequestFactory。

回答

5

在我看來:

有沒有路過的地方的構造函數對象引用的問題。這樣,您可以在點擊要編輯的行時輕鬆傳遞聯繫人蔘考。

但是,將整個對象用作令牌可能不是一個好主意。我認爲最好是使用它的id,然後在去迷惑時從id中獲取對象並將其傳遞給構造函數。

就Expenses例子而言,我相信這是因爲他們使用了Request Factory,它具有那些實體定位器,它可以很容易地根據它們的ID獲取實體。

+0

謝謝jonasr。當然,對象本身並不是令牌。在我的情況下,該對象有一個可以用作令牌的ID。但標記化是另一個問題。我想我問是否有一個設計上的缺點讓Place有狀態,但是因爲Javadoc for Place期望它實現equals()我想Place可以在它中有對象引用。 – Glenn 2011-06-07 19:58:40

+0

將對象放置在您的位置而不僅僅是它的ID不會使其成爲「有狀態」。唯一的缺點是我能看到的是,「處理」這個地方的代碼(你的ContactEditorActivity)將不得不迎合對象不在那裏的情況(因爲這個地方已經從一個歷史令牌重新構建),這導致更復雜的代碼。我認爲總體思路是要傳遞ID,但是有一些緩存機制,這樣您就可以從ID中取回對象,而無需與服務器聯繫。 – 2011-06-08 08:43:05

2

如果你想要分離的地方,那麼你可以創建封裝你的對象的自定義事件,然後通過事件總線傳遞這個事件。

更新:

歷史/地方支持與片段標識符進行(這就是官方的用語,谷歌稱他們爲歷史或地方的標記)。位置是通過解析FI(標記化)創建的。您可以用任何方式格式化FI,但限制是它們是字符串。 FI格式可以是任何東西(例如#place/subplace:arg1:arg2)。分析FI並創建Place是分析器的工作。

在你的情況下,FI可以是#contactedit:id。因此,您的標記器會解析此標記以創建包含要編輯的聯繫人的ID的ContactEditorPlace。

+1

謝謝,彼得,但我不想解耦。我想結合(是的,是的,「她就是這麼說的」)。聯繫人列表和聯繫人編輯器緊密相連。如果我的編輯器視圖只是幾個字段,我可以跳過創建一個Place並在ContactEditorView構造函數中爲聯繫人添加引用,並在DialogBox中顯示該編輯器,但對於彈出窗口並且需要一個屏幕很大。在構造函數中添加一個引用是幾行代碼,它使事件總線 – Glenn 2011-06-07 19:37:33

+0

我想說的是,與事件總線解決方案相比,在構造函數中放置一個引用只需要幾行,而至少需要另一個類 - 它不應該是那很難。 – Glenn 2011-06-07 19:45:06

1

地方的目的是代表歷史記號。在這種情況下,Place對象中的值將成爲應用程序url的一部分。這意味着用戶可以隨時將該網址放入瀏覽器中,並通過該網址重建一個Place對象。當你傳遞一個對象引用時,這個對象在用戶傳遞一個url時不存在。我經常使用普遍的規則,即放置在Place對象中的值應該被用來唯一標識或重新創建應用程序的特定狀態,並且僅僅因爲通過位置傳遞值很容易就沒有值。

在這種情況下,您可以在Place中傳遞對象的id,並從您保存在應用程序中的某個緩存中獲取對象(如果緩存中不存在,則轉到服務器)或直接從服務器獲取對象。

+0

感謝希爾布蘭德。我知道Place用於創建導航的URL,並啓用從url重建狀態。而最基本沒有記錄的感覺就是它應該以最小的方式做到這一點,這就是爲什麼我想知道是否使用Place作爲參考是一個壞主意。但請注意,我已經爲我想要的數據準備了一個cache_:它被稱爲ContactList。您的解決方案相當於再次下載相同的數據,或者編寫客戶端持久層。 – Glenn 2011-06-07 22:06:43