2012-01-21 40 views
0

我正在使用SmartGWT在GAE上編寫GWT項目。SmartGWT - 凌駕tranformRequest和transformResponse

我有一個DB對象,每個都有一個「父」對象和「兒子」,我用TreeGrid來表示它們。我已經有了一個GWT-RPC服務來獲取給定節點的兒子。

我現在需要的是以某種方式擴展DataSource類st當打開一個樹節點時,我將能夠使用我自己的服務去獲取它的子 - 然後將它們返回爲TreeGrid可以處理的東西。

我知道我想重寫transformRequest和transformResponse,但我不知道如何。任何代碼示例/解釋將不勝感激!

這是我迄今爲止 - 不知道它甚至遠程正確:

   budgetTree.setDataSource(new DataSource() { 

      @Override 
      protected Object transformRequest(final DSRequest dsRequest) { 

       expensesService.getExpensesByYear(2008, 
        new AsyncCallback<ExpenseRecord[]>() { 

        @Override 
        public void onSuccess(ExpenseRecord[] result) { 
         System.out.println("Returned " + result.length + " expense record ");    
         dsRequest.setAttribute("dsResult", result); 
        } 

        @Override 
        public void onFailure(Throwable caught) { 
         System.out.println("Failed to run query"); 
        } 

        }); 

       return dsRequest; 
      } 

      @Override 
      protected void transformResponse(DSResponse response, DSRequest request, 
       Object data) {  
       Record[] recs = request.getAttributeAsRecordArray("dsResult"); 
       response.setData(recs); 
       super.transformResponse(response, request, data); 
      } 


      }); 

回答

1

因爲你是你自己進行實際的請求,您首先需要在 setDataProtocol(DSProtocol.CLIENTCUSTOM);

看起來那麼在這兩個onSuccessonFailure你需要調用processResponse()它將調用transformResponse()

public class MyDatasource extends DataSource{ 
    public MyDatasource(){ 
     setDataProtocol(DSProtocol.CLIENTCUSTOM)   
    } 

    @Override 
    protected Object transformRequest(final DSRequest dsRequest) { 

      expensesService.getExpensesByYear(2008, 
       new AsyncCallback<ExpenseRecord[]>() { 

       @Override 
       public void onSuccess(ExpenseRecord[] result) { 
        DSResponse response = new DSResponse(); 
        System.out.println("Returned " + result.length + " expense record ");    
        dsRequest.setAttribute("dsResult", result); 
        Record[] recs = request.getAttributeAsRecordArray("dsResult"); 
        response.setData(recs); 
        processResponse(dsRequest.getRequestId(), dsResponse); 
       } 

       @Override 
       public void onFailure(Throwable caught) { 
        DSResponse response = new DSResponse(); 
        System.out.println("Failed to run query"); 
        processResponse(dsRequest.getRequestId(), dsResponse); 
       } 

       }); 

      return dsRequest; 
    } 

}

+0

謝謝!我應該使用默認的transformResponse函數,還是我需要覆蓋它呢? – Yossale

+0

如果您沒有進一步轉換響應,則不需要重寫transformResponse()。 – Abhijith