0

我需要你对 gwt requestfactory 的帮助

考虑以下场景:
我从服务器获取现有实体(比如说发票):

InvoiceEntityProxy invoice = request1.getInvoice();

我想进行一些更改,因此我使用新请求对其进行了编辑:

InvoiceEntityProxy editableInvoice = request2.edit(invoice);
//make some changes to editableInvoice

现在我将第二个请求所做的更改发送到服务器,以创建预览:

request2.createPreview(editableInvoice);

发送请求后,发票代理被冻结,我通过将代理分配给新请求来重新启用编辑:

editableInvoice = request3.edit(editableInvoice);

如果一切正常,我想使用最新请求更新代理并将其发送到服务器:

request3.update(editableInvoice);

但是这些更改永远不会到达服务器,因为最新的请求 (request3) 对分配给 request2 的代理所做的更改一无所知。

我考虑了以下解决方案:

  1. 我可以重做最新代理的更改。但是为此,我必须遍历所有属性并再次设置它们(不是很友好的解决方案,因为每次向代理添加一些属性时我都必须调整方法)
  2. 另一种方法是将不带 id 的 proyx 发送到服务器,并将 id 作为更新方法的第二个参数发送。但这将是一种耻辱,因为不仅增量会被发送到服务器(这是 requestFactory 的最大特性之一)。

那么,当将代理分配给另一个请求时,让 request3 知道已经对代理所做的更改的最佳和最常见的做法是什么。

4

3 回答 3

1

好的!我找到了解决我的问题的方法。

我仍然有一个原始代理的实例,因为上下文的 edit() 方法总是返回一个新的代理实例。所以我在发送任何请求之前保存了原始代理。

每次成功请求后,我通过再次调用 edit 方法重新启用编辑代理:

editableInvoice = request3.edit(editableInvoice);

现在的症结:我可以设置一个代理的原始代理,用于考虑它是否改变以及改变了什么。这是通过使用 AutoBean 并像这样设置 PARENT_OBJECT 标记来完成的:

AutoBean<InvoiceEntityProxy> editableInvoiceBean = AutoBeanUtils.getAutoBean(editableInvoice);
AutoBean<InvoiceEntityProxy> originalInvoiceBean = AutoBeanUtils.getAutoBean(originalInvoice);

editableInvoiceBean.setTag(Constants.PARENT_OBJECT, originalInvoiceBean);

在下一个请求中,所有更改的属性都会再次发送到服务器。

感谢您的帮助,感谢您对 AutoBean @Zied Hamdi 的提示

于 2014-02-14T10:16:39.123 回答
1

你只是忘记打电话了fire()。例子

request2.createPreview(editableInvoice).fire();

请记住,如果以下请求依赖于前一个请求的结果,则应将代码放在方法中,OnSuccess因为请求是异步的

也可以附加多个请求

编辑

对编辑和触发操作使用相同的请求很重要。所以替换这一行

request.update(editableInvoice);

request3.update(editableInvoice);
于 2014-02-13T15:45:58.977 回答
0

您还可以在开始更改对象之前使用AutoBeans来复制对象。您可以保持原始对象不变,然后 request.edit() 它并应用“脏”对象中的更改(内省等更改)。

您可能需要对如何处理 EntityProxies 进行一些研究,因为它们是“特殊的 AutoBeans”:我必须使用特殊的实用程序对象将它们序列化为 json(在 GWT 中可用)。所以在做深拷贝时也可能有一些特殊的处理。

GWT 可能存在一个问题,每个 EntityProxy 只保留一个版本(我从未检查它是全局的还是仅在请求的上下文中)

于 2014-02-13T21:12:03.427 回答