有谁知道使用RequestFactory的GWT CellTable示例,并且正在编辑该表?我想列出表中的对象(每一行是一个对象,每一列是一个属性),能够轻松添加新对象并进行编辑。我知道Google的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上-我应该将其插入表还是忘掉它?
谢谢你的帮助。
最佳答案
是。
每个HTTP请求应该有一个上下文(每个
fire()
),而不是fire()
d的上下文是无用的(仅当您/用户改变主意并且不想保存时才这样做)变化)。实际上,您只需要删除一个上下文(请参见下文)。
请注意,您保存每个字段更改的方法可能会导致“竞赛条件”,因为一次代理最多只能由一个上下文
edit()
编码,并且该代理将一直附加到上下文,直到服务器响应为止(并且一旦上下文触发后,代理也会被冻结(只读),直到服务器响应为止。(并非在所有情况下都是如此:当调用onConstraintViolation时,上下文及其代理未冻结,因此您可以“修复”约束违例并再次触发上下文;这应该是安全的,因为在服务器端进行验证之前,任何服务方法都称为)。
您的代码看起来还可以,只是您应该在与用于持久化代理的上下文相同的上下文中创建代理。
当我得到一个可编辑的对象时,在fieldUpdater上使用
我不确定100%,但是我认为您应该刷新表格(类似于
setRowData(index, Collections.singletonList(object))
)顺便说一句,驾驶员们提到的可能是Editor framework中的
RequestFactoryEditorDriver
。这对您没有帮助(实际上恰恰相反)。