2011-06-07 55 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