GWT RequestFactory + CellTable
Posted
技术标签:
【中文标题】GWT RequestFactory + CellTable【英文标题】: 【发布时间】:2011-10-11 10:43:22 【问题描述】:有谁知道 GWT 的 CellTable 使用 RequestFactory 的示例并且该表正在被编辑?我想在表格中列出对象(每一行是一个对象,每一列是一个属性),能够轻松添加新对象和编辑。我知道 Google 的 DynaTableRf 示例,但没有编辑。
我在 Google 和 *** 上进行了搜索,但没有找到。我对 RF 的上下文有点困惑,而且人们还提到了一些“驱动程序”。
为了展示我目前到达的位置,我附上一栏的代码:
// Create name column.
Column<PersonProxy, String> nameColumn = new Column<PersonProxy, String>(
new EditTextCell())
@Override
public String getValue(PersonProxy person)
String ret = person.getName();
return ret != null ? ret : "";
;
nameColumn.setFieldUpdater(new FieldUpdater<PersonProxy, String>()
@Override
public void update(int index, PersonProxy object, String value)
PersonRequest req = FaceOrgFactory.getInstance().requestFactory().personRequest();
PersonProxy eObject = req.edit(object);
eObject.setName(value);
req.persist().using(eObject).fire();
);
以及我的数据提供者代码:
AsyncDataProvider<PersonProxy> personDataProvider = new AsyncDataProvider<PersonProxy>()
@Override
protected void onRangeChanged(HasData<PersonProxy> display)
final Range range = display.getVisibleRange();
fetch(range.getStart());
;
personDataProvider.addDataDisplay(personTable);
...
private void fetch(final int start)
lastFetch = start;
requestFactory.personRequest().getPeople(start, numRows).fire(new Receiver<List<PersonProxy>>()
@Override
public void onSuccess(List<PersonProxy> response)
if (lastFetch != start)
return;
int responses = response.size();
if (start >= (personTable.getRowCount()-numRows))
PersonProxy newP = requestFactory.personRequest().create(PersonProxy.class);
response.add(newP);
responses++;
personTable.setRowData(start, response);
personPager.setPageStart(start);
);
requestFactory.personRequest().countPersons().fire(new Receiver<Integer>()
@Override
public void onSuccess(Integer response)
personTable.setRowCount(response+1, true);
);
我尝试将最后一个对象插入一个新的空对象。当用户填写它时,我会在它之后插入一个新的。但是代码不起作用。我说用户正在“尝试”编辑以前由另一个 RequestContext 编辑的对象。
困境: * 我是否创建了太多上下文? * 如何正确地将新对象插入到客户端创建的单元表中? * 当我获得一个可编辑对象时在 fieldUpdater 上 - 我应该将它插入回表中还是忘记它?
感谢您的帮助。
【问题讨论】:
【参考方案1】:我是否创建了太多上下文?
是的。
每个 HTTP 请求(每个 fire()
)都应该有一个上下文,而不是 fire()
d 的上下文是无用的(只有在您/用户改变主意并且不想这样做时才这样做,例如,保存您/他的更改)。
您实际上只有一个上下文可以在此处删除(见下文)。
请注意,您保存每个字段更改的方法可能会导致“竞争条件”,因为代理一次最多可以由一个上下文 edit()
ed,并且在服务器响应之前它一直连接到上下文(一旦触发上下文,代理就会被冻结——只读——直到服务器响应为止)。
(并非在所有情况下都是如此:当调用 onConstraintViolation 时,上下文及其代理被解冻,因此您可以“修复”约束违规并再次触发上下文;这应该是安全的,因为之前在服务器端完成了验证调用任何服务方法)。
如何正确地将新对象插入到客户端创建的单元表中?
您的代码看起来没问题,只是您应该在与用于持久化它的上下文相同的上下文中创建代理。
当我获得一个可编辑对象时在 fieldUpdater 上 - 我应该将它插入回表中还是忘记它?
我不是 100% 确定,但我认为您应该刷新表格(类似于 setRowData(index, Collections.singletonList(object))
)
顺便说一句,人们提到的 driver 可能是来自Editor framework 的RequestFactoryEditorDriver
。它在这里对你没有帮助(实际上恰恰相反)。
【讨论】:
托马斯,谢谢你的回答!我用我创建一次的字段替换了对 personRequest() 的所有调用。但是我得到“java.lang.IllegalStateException:一个请求已经在进行中”。我检查了是否有一些“scheduleFire”方法,但没有。我想我应该平衡并以某种方式明智地使用创建上下文,跟踪它们并关心它们何时进行,何时不进行。但我想发明热水......是否有任何示例/教程已经在 CellTable 上使用 RequestFactory (或一些类似的编辑小部件)?必须有一些既定的解决方案。 我找到了一篇很好的博客,它很好地解释了有关 RequestFactory 的一些细节:fascynacja.wordpress.com/2011/04/17/… 您能解释一下您对编辑器框架的评论吗?是否有一些根本原因不应该期望 CellTable(或 DataGrid)与 RequestFactoryEditorDriver 配合得很好?以上是关于GWT RequestFactory + CellTable的主要内容,如果未能解决你的问题,请参考以下文章
什么时候应该使用 RequestFactory 与 GWT-RPC?
GWT/AppEngine:设计 RequestFactory 工作流以更好地处理异常
GWT 2.6 - RequestFactory Locator 找不到类似的域方法