使用GET实体代理暂时保存更改。实施“应用更改”模式

时间:2012-10-22 08:35:10

标签: gwt entity gwt-celltable

我有CellTable<UserProxy>。换句话说,它直接管理我的数据库实体的实体代理。有了它,我使用AsyncDataProvider<UserProxy>使用请求工厂获取数据。 我的列的单元格是EditTextCell。我添加了FieldUpdater<UserProxy, String>来编辑值。除了这里是我的问题:如果我更新实体的值并立即保存它可以正常工作,但我不知道如何将保存与以后点击按钮区别开来。

基本上,我想实现Apply-changes模式(参见:http://patterns.holehan.org/Review/ApplyChanges),所以我希望用户能够在表中编辑多个值,一旦完成,他可以点击'apply '按钮将保存所有更改。

所以我的想法是更改代理实体中的值而不调用save,然后在按钮的clickhandler中保存所有已修改的实体。

但要更改代理实体中的值,我必须先调用ctx.edit(user):

nameColumn.setFieldUpdater(new FieldUpdater<UserProxy, String>() {
    @Override
    public void update(int index, UserProxy object, String value) {
        if (!value.equals(object.getName())) {
            UserRequest ur = presenter.getClientFactory().getRequestFactory().getUserRequest();
            ur.edit(object);
            object.setName(value);
            saveButton.setEnabled(true);
        }
    }
});

这使得以后无法在应用按钮的点击处理器中保存它们:

private void saveModifications() {
    List<UserProxy> items = cellTable.getVisibleItems();
    for (UserProxy item : items) {
        UserRequest ur = presenter.getClientFactory().getRequestFactory().getUserRequest();
        ur.save(item).fire();
    }
    cellTable.setVisibleRangeAndClearData(cellTable.getVisibleRange(), true);
}

因为调用save(item)会引发此异常:java.lang.IllegalArgumentException: Attempting to edit an EntityProxy previously edited by another RequestContext

如何避免这种情况而又不必再创建另一个代表同一实体的类?

1 个答案:

答案 0 :(得分:1)

您必须使用单个RequestContext实例edit()所有代理。您可以edit()多次使用相同的代理,没有错误,也没有开销。

所以:

  1. presenter.getClientFactory().getRequestFactory().getUserrequest()存储在某个地方的变量/字段中
  2. FieldUpdater s中
  3. ctx.edit(object).setName(value)会将RequestContext中的更改排入队列;可能会将UserProxy放在Set中以供日后参考
  4. saveModifications中,遍历您的代理(可能只有来自Set基于步骤2构建的代理)和ctx.save(item),然后循环结束ctx.fire() < / LI>