3

有谁知道使用 RequestFactory 的 GWT 的 CellTable 示例并且该表正在被编辑?我想在表格中列出对象(每一行是一个对象,每一列是一个属性),能够轻松添加新对象和编辑。我知道谷歌的 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 上 - 我应该将它插入到表中还是忘记它?

谢谢你的帮助。

4

1 回答 1

1
  • 我是否创建了太多上下文?

是的。

每个 HTTP 请求 (per fire()) 应该有一个上下文,并且不是fire()d 的上下文是无用的(仅当您/用户改变主意并且不想保存您/他的更改时才这样做) .
您实际上只有一个上下文可以在此处删除(见下文)。

请注意,您保存每个字段更改的方法可能会导致“竞争条件”,因为代理一次最多可以edit()由一个上下文编辑,并且它一直连接到上下文直到服务器响应(并且一旦上下文被被触发,代理被冻结——只读——直到服务器响应)。
(并非在所有情况下都是如此:当调用 onConstraintViolation 时,上下文及其代理被解冻,因此您可以“修复”约束违规并再次触发上下文;这应该是安全的,因为之前在服务器端完成了验证调用任何服务方法)。

  • 如何正确地将新对象插入到在客户端创建的单元表中?

您的代码看起来不错,只是您应该在与您将用来持久化它的上下文相同的上下文中创建您的代理。

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

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

顺便说一句,人们提到的驱动程序RequestFactoryEditorDriver可能来自Editor 框架。它在这里对你没有帮助(实际上恰恰相反)。

于 2011-10-11T15:45:28.020 回答