【问题标题】:GWT How discard changes on a EditorGWT 如何丢弃编辑器上的更改
【发布时间】:2012-04-13 17:27:22
【问题描述】:

我有没有办法让编辑器放弃对其属性所做的更改?这在客户端。没有毅力。

我有:

public class ClaseEditor extends PopupPanel implements Editor<ClaseProxy> {
  @UiField ValidatedTextBox tema;
  @UiField ValidatedTextBox catedratico;
}

我在 ListEditor 上使用此编辑器,因为您知道您的编辑器中有一个列表

 ListEditor<ClaseProxy, ClaseEditor>

如果用户创建一个,没关系,然后如果用户编辑它。我有保存或取消选项,我保存好了,只需隐藏编辑器,所做的更改就可以了。

但在用户单击取消时,如果属性发生一些更改,编辑器会刷新(延迟)更改为代理。

是的,我可以将起始值存储在字符串上,然后在 texbox 上使用 setValue() 进行恢复。但是还有其他方法(Editor API)可以防止这种情况发生吗?

谢谢

【问题讨论】:

    标签: gwt editor


    【解决方案1】:

    如果您使用的是SimpleBeanEditorDriver,则可以对edit 方法进行新调用,而无需先调用flush

    SimpleBeanEditorDriver 类从 bean 读取到 edit 上的编辑器,并从编辑器读取到 flush 上的 bean。

    如果您不想恢复所有编辑器,而只想恢复其中一个,请记住在每次接受编辑器更改时调用flush,以便能够恢复到最后一个flush 点。请注意,flush 调用是本地调用,不一定必须对应于对持久层的调用。

    示例代码

    private Bean currentObject;
    
    /**
     * Start editing the given object.
     */
    public void edit(Bean object) {
      this.currentObject = object;
      this.driver.edit(object);
    }
    
    /**
     * Call this every time an editor is in a consistent state.
     * (e.g. onBlur event if validation succeeds)
     */
    private void save() {
      this.driver.flush(); // saves editors' state into currentObject
    }
    
    /**
     * Call this to cancel changes on all editing editors.
     * (e.g. onBlur event if validation fails)
     */
    private void revert() {
      this.driver.edit(currentObject); // reloads currentObject into editors
    }
    
    /**
     * Stores all pending changes to the server.
     * Remember to validate all editors.
     */
    public void commit() {
      Bean object = this.driver.flush();
      Server.persist(object);
    }
    

    【讨论】:

      【解决方案2】:

      是的。在取消按钮上,执行 fire() 而不构建任何请求。编辑器所做的永远不会影响原始代理,它是不可变的。刷新只给你一个副本(除非你使用 RequestFactoryEditorDriver 然后它返回你发送给它的上下文 driver.edit(proxy,ctx) 。如果用户想再次编辑它赢了,没有请求的 fire() 会清除编辑代理副本'不会得到它已经被编辑的错误。

      【讨论】:

      • EditorDriver.flush() 不会使用 SimpleBeanEditorDriver 返回副本,它会要求所有子编辑器将其更改刷新回原始对象。还是我误解了“给你一份”的意思?
      • 在简单的 beans 驱动程序中,flush 为您提供了代理的可编辑副本。原始代理与您第一次检索时相同。刷新一词看起来似乎可以将已编辑的更改刷新回原始代理,但事实并非如此。
      • SimpleBeanEditorDriver 不假定代理,因此它可以在普通 bean 上使用,这意味着它不能复制它使用的模型。 RequestFactoryEditorDriver 在将值传递给编辑器之前确实会运行 context.edit - 也许您正在考虑这样做?
      • 你说得对,我没想到 SimpleBeanEditorDriver。虽然我在想编辑器。虽然我确实同时使用了 Editor 和 RequestFactoryEditorDriver,但我从未使用过 SimpleBeanEditorDriver。所以我不知道flush对SimpleBeanEditorDriver做了什么。如果我错了,请纠正我,但 Editor 上的 flush() 返回已编辑代理的副本, RequestFactoryEditorDriver 返回您在其上调用 edit() 的上下文。
      • Editor&lt;&gt; 实际上不支持任何方法,它只是一个标记接口。由于 GWT 中缺乏通用反射,很难找到一种通用的方式来克隆所有对象(或者至少是一种有效的通用方式)。委托是围绕每个编辑器构建的,这些委托只与子编辑器或编辑器接口实现的特定方法(如 ValueAwareEditor 具有 setValue)对话。如果需要,RequestFactoryEditorDelegate.ensureMutable(T) 会调用 context.edit。
      猜你喜欢
      • 1970-01-01
      • 2022-06-21
      • 2019-10-12
      • 2012-05-25
      • 2015-03-08
      • 2011-06-28
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多