我需要你对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的代理所做的更改一无所知。
我考虑过以下解决方案:
那么,当将request3分配给另一个请求时,让request3知道已经对代理进行的更改的最佳和最常见的做法是什么。
答案 0 :(得分:1)
您只是忘记致电fire()
。实施例
request2.createPreview(editableInvoice).fire();
请记住,如果以下请求取决于前一个请求的结果,则应将代码放在OnSuccess
方法中,因为请求是异步的
还可以append多个请求
修改强>
对编辑和消防操作使用相同的请求很重要。所以替换这一行
request.update(editableInvoice);
与
request3.update(editableInvoice);
答案 1 :(得分:1)
尼斯!我找到了解决问题的方法。
我仍然有原始代理的实例,因为上下文的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的提示
答案 2 :(得分:0)
在开始更改对象之前,您还可以使用AutoBeans复制对象。您可以保持原始的不变,然后request.edit()它并从“脏”对象应用更改(内省更改)。
您可能需要对如何处理EntityProxies进行一些研究,因为它们是“特殊AutoBeans”:我必须使用特殊的实用程序对象将它们序列化为json(在GWT中可用)。因此,在执行深层复制时可能会有一些特殊处理。
GWT可能存在一个问题,只保留每个EntityProxy的一个版本(我从未检查过它是全局的还是仅在请求的上下文中)