【问题标题】:GWT EditorDriver Proxy Object ModificationGWT EditorDriver 代理对象修改
【发布时间】:2012-10-22 11:52:25
【问题描述】:

这是我之前提出的一个问题的编辑版本(该问题由 tbroyer 回答),为什么在尝试修改实体的 Editor 版本后,isDirty() 方法没有返回 true。我认为我对RequestFactory/EditorDriver 处理实体的理解是问题所在,而isDirty() 问题是一个红鲱鱼。我在这个问题的末尾留下了我原来的问题,但我的新问题是:

如何在代码中修改 EditorDriver 正在编辑的实体(代理)?显然,值会随着用户界面的变化而改变;但我不知道如何在“幕后”改变价值观。我的理解是对EditorDriver.edit() 的调用将创建代理对象的副本,随后对该副本的任何更改都将使用EditorDriver.flush() 应用于原始对象。但是EditorDriver.edit() 不返回对正在编辑的对象的引用(与RequestContext.edit() 不同,它确实返回对正在编辑的对象的引用)。

原始(消息灵通)问题:

我不明白为什么 EditorDriver.isDirty() 方法在以下情况下不返回 true(当从列表框中选择新的组织时调用以下 onOrgSelectedEvent() 方法):

private IOrgProxy _org;
...
/**
 * Loads the currently selected Org into the editor. 
 */
@Override
public void onOrgSelectedEvent(final OrgSelectedEvent orgSelectedEvent) {
  IOrgProxy org = _clientFactory.getCache().getOrgCache().getOrg(orgSelectedEvent.getOrgId());
  _orgRequestContext = _clientFactory.getRequestFactory().newOrgRequestContext();
  _org = _orgRequestContext.edit(org);
  _orgEditorDriver.edit(_org, _orgRequestContext);
  _org.setName(_org.getName() + " (edit)");
  if (_orgEditorDriver.isDirty()) {
    _org.setName(org.getName());
  }
}

当我在 setName() 调用上设置断点时,我看到第一个调用更改了可编辑 Org 对象中的名称,但从未到达第二个 setName() 调用(即 _orgEditorDriver.isDirty() 返回 false)。

作为一个附带问题,EditorDriver.edit() 方法不返回可编辑的代理对象,而且我必须调用 RequestContext.edit(),这对我来说似乎很奇怪,但这是一个非常小的问题。

【问题讨论】:

    标签: gwt requestfactory


    【解决方案1】:

    为什么isDirty 会在edit 之后为真?显然,用户没有时间进行任何更改。

    isDirty 比较子编辑器的当前值和它们的原始值,它不关心对象是否改变:如果你把对象借给编辑器,你就隐含地让它控制被编辑的对象(对于被编辑的属性)。

    【讨论】:

    • 那么对RequestContext.edit() 的调用会创建代理对象的副本吗?并调用EditorDriver.edit() 创建另一个副本?如果是这样,我不需要打电话给RequestContext.edit();但是如何修改编辑器拥有的对象?
    • RequestContext.edit() 创建代理的副本。 RequestFactoryEditorDriver.edit() 调用RequestContext.edit(),它不会创建新对象:对于给定的stableId(),RequestContext 中只有一个可编辑的代理实例。在edit() 和flush() 之间,只能通过其Editor 更改属性;如果该属性没有Editor,那么您可以独立于EditorDriver“编辑周期”进行更改。
    • 非常感谢,Thomas ...我非常感谢您的帮助和您的博客文章,我想我现在明白了:如果我更改“name”属性的值,那么我需要这样做使用name.setText()(name 是屏幕上的字段);我无法使用 _org.setName() 更改它。
    • 但是,如果我想标记任何已查看的记录,无论用户是否实际更改了值,我仍然有一个问题。如果我在数据库中有代表“ViewDate”和“ViewUserId”的列,那么我会将它们引入实体;但是这些字段不会有Editor,并且值会在后台更改;但我认为isDirty() 将返回false,因此我需要另一种方法来知道该实体需要被刷新和触发(发送回服务器)。
    • 我应该使用RequestContext.isChanged()而不是EditorDriver.isDirty()吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 2011-05-23
    • 2011-02-27
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    相关资源
    最近更新 更多