有谁知道使用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时,上下文及其代理未冻结,因此您可以“修复”约束违例并再次触发上下文;这应该是安全的,因为在服务器端进行验证之前,任何服务方法都称为)。


  • 如何将新对象正确插入到客户端创建的celltable中?


  • 您的代码看起来还可以,只是您应该在与用于持久化代理的上下文相同的上下文中创建代理。


    当我得到一个可编辑的对象时,在fieldUpdater上使用
  • -我应该将其插入表中还是忘记它?


  • 我不确定100%,但是我认为您应该刷新表格(类似于setRowData(index, Collections.singletonList(object)))

    顺便说一句,驾驶员们提到的可能是Editor framework中的RequestFactoryEditorDriver。这对您没有帮助(实际上恰恰相反)。

    10-04 20:10