首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GWT RequestFactory + CellTable

GWT RequestFactory + CellTable
EN

Stack Overflow用户
提问于 2011-10-11 18:43:22
回答 1查看 2K关注 0票数 3

有没有人知道GWT的CellTable使用RequestFactory的一个例子,这个表正在被编辑?我想在一个表中列出对象(每行是一个对象,每列是一个属性),能够轻松地添加新的对象和编辑。我知道谷歌的DynaTableRf示例,但那个不能编辑。

我在Google和stackoverflow上搜索了一下,但是没有找到。我对RF的上下文有点困惑,然后人们还提到了一些“驱动程序”。

为了演示我目前到达的位置,我附加了一个专栏的代码:

代码语言:javascript
复制
        // 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();
        }
    });

和我的数据提供程序代码:

代码语言:javascript
复制
        AsyncDataProvider<PersonProxy> personDataProvider = new AsyncDataProvider<PersonProxy>() {
        @Override
        protected void onRangeChanged(HasData<PersonProxy> display) {
          final Range range = display.getVisibleRange();

          fetch(range.getStart());
        }
      };
    personDataProvider.addDataDisplay(personTable);

..。

代码语言:javascript
复制
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上,当我得到一个可编辑的对象时-我应该将它插入回表中还是忘记它?

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-11 23:45:28

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

是。

每个HTTP请求(每个fire())都应该有一个上下文,而不是fire()d的上下文是无用的(只有当您/用户改变主意并且不想保存您/他的更改时才这样做)。

实际上,您在这里只有一个要删除的上下文(见下文)。

请注意,每次字段更改时保存的方法可能会导致“竞争条件”,因为代理一次最多只能由一个上下文执行edit()操作,并且它会一直附加到上下文,直到服务器响应为止(一旦触发上下文,代理就会冻结为只读状态,直到服务器响应为止)。

(并非在所有情况下都是如此:当调用onConstraintViolation时,上下文及其代理被解冻,因此您可以“修复”违反约束的情况并再次触发上下文;这应该是安全的,因为验证是在调用任何服务方法之前在服务器端完成的)。

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

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

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

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

顺便说一句,人们提到的驱动程序可能是Editor frameworkRequestFactoryEditorDriver。它在这里帮不了你(实际上恰恰相反)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7724750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档