2011-10-11 150 views
3

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

我搜索谷歌和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中,在客户端创建?
* on fieldUpdater当我得到一个可编辑的对象时 - 我应该将它插回到表中还是忘了它?

感谢您的任何帮助。

回答

1
  • 我是否创造了太多的背景?

是的。

每个HTTP请求应该有一个上下文(每个fire()),并且上下文不是fire() d是无用的(只有当用户改变了他/他的想法并且不想这样做时,例如,保存你的/他的更改)。
实际上你只有一个上下文可以在这里删除(见下文)。

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

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

您的代码看起来不错,除了你应该在同样的情况下,你会用坚持它的人创建的代理。

  • 上fieldUpdater当我得到一个可编辑的对象 - 我应该将它装回表或忘记了吗?

我不是100%肯定,但我认为你应该刷新表(像setRowData(index, Collections.singletonList(object))

顺便说一句,在司机人们提到可能是从Editor frameworkRequestFactoryEditorDriver。它不会帮助你(实际上恰恰相反)。

+0

托马斯,谢谢你的回答!我用一次创建的字段将所有调用替换为personRequest()。但比我得到“java.lang.IllegalStateException:请求已在进行中”。我检查了是否有一些“scheduleFire”方法,但事实并非如此。我想我应该平衡,并以某种方式明智地使用创建背景,跟踪它们并关心它们何时进行,何时不进行。但我觉得像发明热水......有没有任何示例/教程已经与CellFable上的RequestFactory(或一些类似的编辑部件)做到这一点?必须有一些确定的解决方案。 – hostnik

+1

我发现了一个很好的博客,很好地解释了关于RequestFactory的一些细节:http://fascynacja.wordpress.com/2011/04/17/exciting-life-of-entity-proxies-in-contexts-of-requestfactory/ – hostnik

+0

你能否解释你对编辑框架的评论?是否有一些根本的原因,CellTable(或DataGrid)不应该被期望与RequestFactoryEditorDriver相得益彰? – gatkin