首先我有一个解决方案,但我并不认为它很优雅。所以,我正在寻找一种更清洁的方法来做到这一点。
我在视图面板中显示了 EntityProxy。视图面板是一个仅使用显示模式的RequestFactoryEditorDriver。用户单击数据元素并打开弹出编辑器来编辑 EntityProxy 的数据元素,其中的数据位比视图面板中显示的数据位多一些。当用户保存元素时,我需要视图面板来更新显示。
我遇到了一个问题,因为弹出编辑器流程的 RequestFactoryEditorDriver 不允许您访问已编辑的数据。驱动程序使用与您向服务器发送数据相同的传入上下文,但是从刷新返回的上下文仅允许Receiver<Void>
即使您将其转换为在 edit() 调用中存储在编辑器驱动程序中的上下文类型。 [它似乎也没有发送 EntityProxyChanged 事件,所以我无法监听该事件并更新显示视图。 - 从头开始 - 我现在发现这个事件不适合这个用例]
我找到的解决方案是更改我的域对象持久性以返回新保存的实体。然后像这样创建弹出编辑器
editor.getSaveButtonClickHandler().addClickHandler(createSaveHandler(driver, editor));
// initialize the Driver and edit the given text.
driver.initialize(rf, editor);
PlayerProfileCtx ctx = rf.playerProfile();
ctx.persist().using(playerProfile).with(driver.getPaths())
.to(new Receiver<PlayerProfileProxy>(){
@Override
public void onSuccess(PlayerProfileProxy profile) {
editor.hide();
playerProfile = profile;
viewDriver.display(playerProfile);
}
});
driver.edit(playerProfile, ctx);
editor.centerAndShow();
然后在保存处理程序中,我只需触发()从flush()获得的上下文。虽然这种方法有效,但似乎并不正确。 [看来我应该订阅显示视图中的entitychanged 事件并从那里更新实体和视图。 - 再次刮擦,原因与之前相同] 此外,这种方法保存了完整的实体,而不仅仅是更改的位,这将增加带宽使用。
我认为应该发生的是,当您刷新实体时,它应该“乐观地”更新实体的射频托管版本并触发实体代理更改事件。仅当保存中出现问题时才恢复实体。实际保存应该只发送更改的位。通过这种方式,不需要重新获取整个实体并通过线路发送完整的数据两次。
有更好的解决方案吗?
您似乎并没有真正了解 RF 的细节;另外,你的术语并不能真正帮助理解(冲洗与火)。
RF 中的代理是您检索服务器时服务器状态的快照。您可以对应用程序中其他位置的实体执行任何您想要的操作(通过其他代理),您的代理永远不会更改以反映这些修改。
An EntityProxyChange
当服务器检测到它已更改时,事件将在客户端(对于服务器已知并已从客户端发送的实体)分派:其版本(由getVersion
on the Locator
)已更改,或已被删除(如isLive
的方法Locator
)。如果你不使用Locator
,它将使用getVersion
该实体的和isLive
将被替换为find
通过实体的 ID(由其返回)getId
方法)并检查null
(这也是默认实现isLive
in the Locator
).
就您而言,如果您没有看到EntityProxyChange
正在调度,然后检查您是否正确更新了实体的版本。
最后,RF 总是将您的更改的差异发送到服务器(除了ValueProxy
,在这种情况下 diff 将没有意义)。至于检索数据,默认情况下它不会检索链接的代理,除非您使用明确要求它们with
;这与您可能发送的有关该实体的内容无关。
对于您的情况,要更新视图面板,你有3种可能性:
- 从服务器检索代理(监听
EntityProxyChange
事件或弹出窗口发出明确信号后;你可以使用find
的方法RequestContext
与代理的stableId
作为论据,以及适当的with
以获得您需要的属性)。
当您执行第二个 HTTP 请求时,效率有点低,但另一方面,它可以处理应用程序中其他位置的更改(它们会触发EntityProxyChange
也有活动)
- 在与保存更新的代理相同的 HTTP 请求中检索更新的代理:
save
请求上下文的方法返回保存的实体,或者调用find
相同请求上下文中的方法batch the save
and find
一起在同一个 HTTP 请求中。
这就是你所做的。它发送更改的差异并检索视图面板所需的属性。有人可能会说它的缺点是弹出窗口和视图面板紧密耦合,由您决定这是否是可接受的权衡。
- 使用您在视图面板中编辑并发送到服务器的实体,无需通过网络获取额外数据。
虽然这看起来更简单,但您将错过其他用户可能对实体所做的任何更改(只有服务器知道的更改)。
总而言之,我想我会采用当前的解决方案。不过,关于你的代码,我会launch带有代理和回调的弹出窗口,并将请求上下文和编辑编辑器驱动程序保留为弹出窗口的实现细节:您只需要在完成时回调视图面板,将更新的代理作为参数传递给回调。
关于术语的最后一句话:你flush一个编辑器驱动程序,用于将字段的值复制回对象/代理,并且(独立地,但在您的情况下顺序)您fire用于向服务器发送一批服务方法和代理更改的请求上下文。刷新编辑器驱动程序不会向服务器发送任何内容,这些是不同的操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)