GWT活动和传递引用的位置

GWT活动和传递引用的位置,gwt,gwt2,Gwt,Gwt2,你如何把一个物体从一个地方移到另一个地方 例如,我有一个ContactsView,其中包含一个Contacts表,以及相应的ContactsActivity/Place类。如果要编辑联系人,请单击表格行并转到ContactEditorPlace。ContactEditorView如何获取要编辑的联系人 我所看到的示例似乎强调不在该位置传递实际的对象引用,但它们却麻烦地传递字符串或id(例如,示例)。除了简单的标记化之外,还有其他原因吗?有什么理由不应该在某个地方放置参考资料吗 如果对象引用未在C

你如何把一个物体从一个地方移到另一个地方

例如,我有一个ContactsView,其中包含一个Contacts表,以及相应的ContactsActivity/Place类。如果要编辑联系人,请单击表格行并转到ContactEditorPlace。ContactEditorView如何获取要编辑的联系人

我所看到的示例似乎强调不在该位置传递实际的对象引用,但它们却麻烦地传递字符串或id(例如,示例)。除了简单的标记化之外,还有其他原因吗?有什么理由不应该在某个地方放置参考资料吗

如果对象引用未在ContactEditorPlace的构造函数中设置,那么它如何到达ContactEditorActivity?这可以通过EventBus完成,但要将单个引用传递给单个活动,需要大量的样板文件


我要指出的是,我没有使用RequestFactory。

如果您想拥有解耦的位置,那么您可以创建封装对象的自定义事件,然后通过事件总线传递此事件

更新:

历史/地点支持使用片段标识符(这是官方术语,google称之为历史或地点标记)。位置是通过解析FIs(标记化)创建的。可以按任何方式格式化FIs,但限制是它们是字符串。FI格式可以是任何格式(例如#位置/子位置:arg1:arg2)。您的标记器的工作是解析FI并创建位置

在您的情况下,FI可以是#contactedit:id。因此,您的令牌发生器将解析此令牌,创建包含要编辑的联系人id的ContactEditorPlace。

在我看来:

在place的构造函数中传递对象引用没有问题。这样,当单击要编辑的行时,可以轻松传递联系人引用

但是,使用整个对象作为标记可能不是一个好主意。我认为最好使用它的id,然后在进行去标记时从id中获取对象,并将其传递给构造函数


至于费用示例,我认为这是因为他们使用了请求工厂,该工厂具有实体定位器,可以轻松地根据其ID获取实体。

Place也被设计为表示历史标记。在该上下文中,Place对象中的值成为应用程序url的一部分。这意味着用户可以随时将url放入浏览器中,并从该url重建位置对象。当您传递对象引用时,当用户只传递url时,该对象不存在。我通常使用的一条规则是,放置在Place对象中的值只应用于唯一标识或重新创建应用程序的特定状态,而不应使用值,因为通过Place传递值很容易


在这种情况下,您可以在此处传递对象的id,并从应用程序中保留的某个缓存中获取对象(如果该对象不在缓存中,则会转到服务器),或者直接从服务器获取对象。

谢谢,Peter,但我不想解耦。我想结婚(是的,是的,“她就是这么说的”)。联系人列表和联系人编辑器紧密相连。如果我的编辑器视图只是几个字段,我可以跳过在ContactEditorView构造函数中放置联系人的引用,并在对话框中显示编辑器,但它对于弹出窗口来说太大了,需要一个屏幕。将引用放在构造函数中只需要几行代码,就可以让事件发生。我想说,与至少需要另一个类的事件总线解决方案相比,将引用放在构造函数中只需要几行代码,这应该没那么难。谢谢jonasr。当然,对象本身不是标记。在我的例子中,对象有一个可以用作令牌的id。但标记化是另一个问题。我想我问的是,让一个Place具有状态是否有设计缺陷,但由于Place的Javadoc希望它实现equals(),我认为Place中可以有对象引用。将一个对象放在您的位置而不仅仅是它的ID不会使它具有“状态”。我能看到的唯一缺点是,“处理”位置(ContactEditorActivity)的代码必须满足对象不在那里的情况(例如,因为位置是从历史标记重建的),这会导致更复杂的代码。我认为总体的想法是传递ID,但是有一些缓存机制,这样你就可以从ID中取回对象,而不必联系服务器。谢谢。我知道Place用于创建用于导航的url,并支持从url重建状态。而这种基本上没有文档记录的感觉,即它应该以最小的方式做到这一点,这就是为什么我想知道使用Place作为参考是不是一个坏主意。但是请注意,我已经有了一个缓存来存储我想要的数据:它被称为ContactList。您的解决方案相当于再次下载相同的数据,或者编写客户端持久层。