有没有人知道GWT的CellTable使用RequestFactory的一个例子,这个表正在被编辑?我想在一个表中列出对象(每行是一个对象,每列是一个属性),能够轻松地添加新的对象和编辑。我知道谷歌的DynaTableRf示例,但那个不能编辑。
我在Google和stackoverflow上搜索了一下,但是没有找到。我对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编辑的对象。
困境:
*我是否创建了太多的上下文?
*如何在客户端创建的celltable中正确插入新对象?
*在fieldUpdater上,当我得到一个可编辑的对象时-我应该将它插入回表中还是忘记它?
谢谢你的帮助。
发布于 2011-10-11 23:45:28
是。
每个HTTP请求(每个fire())都应该有一个上下文,而不是fire()d的上下文是无用的(只有当您/用户改变主意并且不想保存您/他的更改时才这样做)。
实际上,您在这里只有一个要删除的上下文(见下文)。
请注意,每次字段更改时保存的方法可能会导致“竞争条件”,因为代理一次最多只能由一个上下文执行edit()操作,并且它会一直附加到上下文,直到服务器响应为止(一旦触发上下文,代理就会冻结为只读状态,直到服务器响应为止)。
(并非在所有情况下都是如此:当调用onConstraintViolation时,上下文及其代理被解冻,因此您可以“修复”违反约束的情况并再次触发上下文;这应该是安全的,因为验证是在调用任何服务方法之前在服务器端完成的)。
您的代码看起来没问题,只是您应该在与用于持久化代理的上下文相同的上下文中创建代理。
我不是100%确定,但我认为你应该刷新表格(类似于setRowData(index, Collections.singletonList(object)))
顺便说一句,人们提到的驱动程序可能是Editor framework的RequestFactoryEditorDriver。它在这里帮不了你(实际上恰恰相反)。
https://stackoverflow.com/questions/7724750
复制相似问题