2011-10-11 188 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