2012-01-21 107 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