【发布时间】:2012-03-20 15:35:26
【问题描述】:
让我从我有一个解决方案开始,但我真的不认为它很优雅。所以,我正在寻找一种更清洁的方法来做到这一点。
我在视图面板中显示了一个 EntityProxy。视图面板是仅使用显示模式的 RequestFactoryEditorDriver。用户单击数据元素并打开弹出式编辑器以编辑 EntityProxy 的数据元素,其中的数据位比视图面板中显示的数据位多。当用户保存元素时,我需要视图面板来更新显示。
我遇到了一个问题,因为弹出编辑器流程的 RequestFactoryEditorDriver 不允许您访问已编辑的数据。驱动程序使用与您用于向服务器发送数据的上下文相同的传递上下文,但是从刷新返回的上下文仅允许 Receiver<Void> 即使您将其转换为您在编辑器中存储在编辑器驱动程序中的上下文类型( ) 称呼。 [它似乎也没有发送 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 托管版本并触发实体代理更改事件。只有在保存中出现问题时才恢复实体。实际保存应该只发送更改的位。通过这种方式,不需要重新获取整个实体并通过线路两次发送完整的数据。
有没有更好的解决方案?
【问题讨论】:
标签: gwt requestfactory