GWT RequestFactory + CellTable

Posted

技术标签:

【中文标题】GWT RequestFactory + CellTable【英文标题】: 【发布时间】:2011-10-11 10:43:22 【问题描述】:

有谁知道 GWT 的 CellTable 使用 RequestFactory 的示例并且该表正在被编辑?我想在表格中列出对象(每一行是一个对象,每一列是一个属性),能够轻松添加新对象和编辑。我知道 Google 的 DynaTableRf 示例,但没有编辑。

我在 Google 和 *** 上进行了搜索,但没有找到。我对 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 编辑的对象。

困境: * 我是否创建了太多上下文? * 如何正确地将新对象插入到客户端创建的单元表中? * 当我获得一个可编辑对象时在 fieldUpdater 上 - 我应该将它插入回表中还是忘记它?

感谢您的帮助。

【问题讨论】:

【参考方案1】:
我是否创建了太多上下文?

是的。

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

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

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

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

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

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

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

【讨论】:

托马斯,谢谢你的回答!我用我创建一次的字段替换了对 personRequest() 的所有调用。但是我得到“java.lang.IllegalStateException:一个请求已经在进行中”。我检查了是否有一些“scheduleFire”方法,但没有。我想我应该平衡并以某种方式明智地使用创建上下文,跟踪它们并关心它们何时进行,何时不进行。但我想发明热水......是否有任何示例/教程已经在 CellTable 上使用 RequestFactory (或一些类似的编辑小部件)?必须有一些既定的解决方案。 我找到了一篇很好的博客,它很好地解释了有关 RequestFactory 的一些细节:fascynacja.wordpress.com/2011/04/17/… 您能解释一下您对编辑器框架的评论吗?是否有一些根本原因不应该期望 CellTable(或 DataGrid)与 RequestFactoryEditorDriver 配合得很好?

以上是关于GWT RequestFactory + CellTable的主要内容,如果未能解决你的问题,请参考以下文章

什么时候应该使用 RequestFactory 与 GWT-RPC?

GWT/AppEngine:设计 RequestFactory 工作流以更好地处理异常

如何在小工具中使用 GWT RequestFactory?

GWT 2.6 - RequestFactory Locator 找不到类似的域方法

GWT RequestFactory + CellTable

GWT-RPC 和 RequestFactory 是互斥的吗?